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自動代碼編寫之旅
目錄
也歡迎進行QQ聯系本人 ,交流我在開發metaPHP過程中的經驗
QQ:309568486
