「php parser」用於產生範本程式碼,或使用其產生的抽象語法樹進行靜態分析;「php parser」是有nikic開發的一款PHP抽象語法樹解析工具,同時兼顧介面易用,結構簡介,工具鏈完善等諸多優點。
本文操作環境:Windows10系統、PHP8.1版、Dell G3電腦
PHP Parser是由nikic 開發的一款php抽象語法樹(AST)解析工具。 PHP Parser同時兼顧介面易用,結構簡潔,工具鏈完善等諸多優點。在工程上,普遍使用PHP Paser產生模板程式碼,或使用其產生的抽象語法樹進行靜態分析。
PHP Parser 是一個用於原始程式碼解析的項目,值得一提的是它使用純PHP 編寫,對於PHP 程式設計師來說,能使用自己熟悉的語言來做靜態分析等原始碼處理,無疑是一大便利。
PHP 是動態語言,效能不高,所以用 PHP Parser 分析 PHP 程式碼,效能也比較差。幸好程式碼分析這種場景,一般對效能要求也不高。
PHP 自帶的token_get_all 函數使用Zend 引擎的語法分析器將原始碼切分成一連串的token,雖然使用這些token 可以完成許多程式碼分析及處理的任務,不過由於token 的結構太原始,遍歷和操作都十分不方便。同樣是基於 token_get_all 分析的結果,著名的程式碼標準化工具 PHP CodeSniffer 就是在對 token 作了很多處理並提供了一系列查找和遍歷的介面的前提下,才讓程式碼分析變得簡單了些。
PHP Parser 可以產生 PHP 程式碼對應的抽象語法樹(AST,即 Abstract Syntax Tree)結構,大幅簡化原始碼的遍歷等操作。
PHP parser 的解析結果範例
對於下列一段PHP 程式碼:
<?php echo 'Hi', 'World';
解析後產生的樹狀結構如下:
array( 0: Stmt_Echo( exprs: array( 0: Scalar_String( value: Hi ) 1: Scalar_String( value: World ) ) ) )
PHP parser 產生的語法樹的結構
為了進一步簡化操作,PHP Parser 將語言節點(Node)分組:
PhpParserNodeStmt 是語句(statement)節點,包括無回傳值和不會出現在表達式的語言結構,例如類別的定義;
PhpParserNodeExpr 是表達式(expression)節點,包括有回傳值和能出現在表達式的語言結構,例如$var (PhpParserNodeExprVariable) 和func() (PhpParserNodeExprFuncCall) 等;
PhpParserNodeScalar 標量(Scalar)節點,例如:'string' (PhpParserNodeScalarString_), 0 (PhpParser 0 (PhpParumber) 和Magcalcan (Php), 0 (PhpParser (PcalarLN) 和合規性 (Php), 0 (PhpParser (PcalarLN) ) 等。它們也算是表達式,所有都繼承自表達式節點;
其他節點,例如:名稱節點(PhpParserNodeName) 和參數節點(PhpParserNodeArg)
凡是節點類別名稱與PHP 關鍵字有衝突的,該節點的類別名稱都統一以_ 結尾,如PhpParserNodeScalarString_。
PHP Parser 能做什麼?
除了單純的將原始碼解析成抽象語法樹以外,它還附帶了以下特性:
程式碼生成,可以將抽象語法樹轉換成PHP 程式碼
抽象語法樹與XML 的相互轉換
導出便於查看的語法樹結構
遍歷與修改語法樹結構的基類(節點遍歷者traverser 和節點訪問者visitor)
支援命名空間的節點訪客
利用語法樹的遍歷,我們能夠寫程式分析程式碼問題。結合程式碼產生和語法樹結構的遍歷修改等特性,我們可以自動化程式碼重構等等。
推薦學習:《PHP影片教學》
以上是php parser怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!