入門metaPHP(php元程式設計引擎)

2022-04-03 03:22:30 字數 3283 閱讀 7326

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

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

廣告進行更替,但是又沒有經歷去做廣告後台,只能手動去更換**。

資料庫表字段增加,要給對應的後台增加對應的輸入框。

某個php介面要淘汰,需要整個**庫去找呼叫,然後替換成新的推薦方法。

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

我打算拿我最熟悉的語言php入手,開發乙個開發php**的php引擎。

metaphp是乙個php元程式設計的引擎,用於用php語言生成php**。

那麼我們以乙個最常用的helloworld的demo來作為開始。

專案**在上

首先引入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就可以直接執行

恭喜你已經開始了metaphp自動**編寫之旅

目錄元**結構

metaphp陣列的使用

函式的使用

類的定義和使用

雜七雜八的

修改已有**

也歡迎進行qq聯絡本人 ,交流我在開發metaphp過程中的經驗

模板元程式設計入門詳解

引述 當我們在程式中要用到乙個需要計算出來的常數,但是又不想在程式中寫表示式 因為影響程式速度 還不想用計算器先算出來再直接用結果,怎麼辦?答 可以考慮用define或const。例如我要用到一天有多少秒,我會定義巨集 define day sec 24 60 60 或者定義常量 const uns...

C 模板元程式設計 入門簡介

範例引入 主模板template struct fib 完全特化版 template struct fib 1 完全特化版 template struct fib 0 int main 主要思想 利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋...

C 模板元程式設計 入門簡介

最近一直在看stl和boost,原始碼裡邊好多涉及到模板元程式設計技術,簡單了解一下,備忘 boost python中的涉及模板元的部分重點關注一下 範例引入 主模板template struct fib 完全特化版 template struct fib 1 完全特化版 template stru...