入門metaPHP(php元編程引擎)


  2017年,柯潔對戰AlphaGo,讓我們了解到在人工智能面前人類智力的渺小。更讓從事開發工作的我感到興奮,我深深地感覺開發的萬能性,程序幫助很多的行業釋放腦力。但是每一個開發人員的開發工作卻很不智能,完全用自己的腦力去開發,這不免是一個極大的諷刺。既然人工智能應用范圍這么廣,為什么不把他應用到開發過程中呢。第一次了解到元編程的概念時,我的頭腦一下被點燃了,我當時就萌生了一個想法,用程序去寫程序一定是未來。

  我在從事php開發過程中,遇到了很多純粹“體力型”的開發工作

  廣告圖片進行更替,但是又沒有經歷去做廣告后台,只能手動去更換代碼。

  數據庫表字段增加,要給對應的后台增加對應的輸入框。

  某個php接口要淘汰,需要整個代碼庫去找調用,然后替換成新的推薦方法。

 

  細細想來,真的是大量的工作修改的結果是固定的。如果這部分工作改為用人工智能去幫助我們寫一部分代碼,那么我們的腦力就可以提煉出來去做更重要的事情。

 

我打算拿我最熟悉的語言php入手,開發一個開發php代碼的php引擎

 

metaPHP是一個php元編程的引擎,用於用php語言生成php代碼。

那么我們以一個最常用的HelloWorld的demo來作為開始。



初始化,項目的代碼發布在github上,可以去拉到自己的項目中。

項目代碼在https://github.com/13601313270/metaPHP

首先引入metaPHP引擎,在自己的代碼中加載metaPHP引擎的include.php文件就引入了metaPHP

<?php
include './metaPHP/include.php';//引入metaPHP
$metaApi = new phpInterpreter('');//參數的含義后面會具體講解

部署好了metaPHP,那么我們就可以開始demo了。

以一個輸出HelloWorld舉例,php代碼應該是

<?php
    echo 'Hello World';

雖然只有代碼很簡單,但是我們仔細審視這段代碼,就自然可以拆解出更加詳細的結構

首先這段代碼,是由一個php代碼開始符和一個echo語句組成,echo可以理解為調用echo函數,參數是一個字符串,字符串的值是Hello World

 

<?php
include './metaPHP/include.php';//引入metaPHP
$metaApi = new phpInterpreter('');

//輸出hello World的代碼的結構,可以理解為下面的復合數組形式
$metaApi->codeMeta = array( 'type'=>'window',
    'child'=>array( array( 'type'=>'phpBegin' ),
        array( 'type'=>'echo',
            'value'=>array( 'type'=>'string',
                'data'=>'Hello World', ), ) ), ); print_r($metaApi->getCode());//獲得生成的php代碼

 

每一個結構都包含一個type字段,代表了這個代碼的類型,每一種代碼結構都必有type屬性,正如剛才說的,代碼層次一層一層的樹形結構組成。最頂層是type=window,代表php運行時。

window運行時會由多個子代碼組成(php開始符、和echo語句)。所以有一個child數組來定義下一級的語句。具體的語法后面的章節會講到。

$metaApi->codeMeta = array(
    'type'=>'window',
    'child'=>array(
        array(
            'type'=>'phpBegin'
        ),
        array(
            'type'=>'echo',
            'value'=>array(
                'type'=>'string',
                'data'=>'Hello World',
            ),
        )
    ),
);

執行這個php程序,會輸出getCode函數的結果。

這是一個生成php代碼的php代碼,所以結果是一個php代碼,接下來你可以把代碼寫入文件系統,就得到了一個可執行的php文件。


 

當然元編程中介代碼如果想執行,也是有對應的方式直接執行,而不必必須保存文件再去執行。這種方式常用於測試、數據驗證等中間步驟

需要使用的就是evalMetaCode類

include './metaPHP/include.php';
$metaApi = new phpInterpreter('');
$metaApi->codeMeta = array(
    'type'=>'window',
    'child'=>array(
        array(
            'type'=>'phpBegin'
        ),
        array(
            'type'=>'echo',
            'value'=>array(
                'type'=>'string',
                'data'=>'Hello World',
            ),
        )
    ),
);
//接收元代碼(數組化的代碼),然后直接run執行
$evalObj = new evalMetaCode($metaApi->codeMeta,array());//使用evalMetaCode類來接收數據化的代碼,然后執行run就可以直接運行 $evalObj->run();

 恭喜你已經開始了metaPHP自動代碼編寫之旅

 

目錄

元代碼結構

metaPHP數組的使用

函數的使用

類的定義和使用

雜七雜八的

修改已有代碼

 

也歡迎進行QQ聯系本人 ,交流我在開發metaPHP過程中的經驗

QQ:309568486


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM