這是一個用 PHP 寫的 PHP 解析器。其目的是簡化靜態程式碼分析和操作。
版本 5.x 的文檔(目前;用於在 PHP >= 7.4 上運行;用於解析 PHP 7.0 到 PHP 8.4,對解析 PHP 5.x 的支援有限)。
版本 4.x 的文檔(支援;用於在 PHP >= 7.0 上運行;用於將 PHP 5.2 解析為 PHP 8.3)。
該庫提供的主要功能是:
將 PHP 7 和 PHP 8 程式碼解析為抽象語法樹 (AST)。
無效程式碼可以解析為部分 AST。
AST 包含準確的位置資訊。
以人類可讀的形式轉儲 AST。
將 AST 轉換回 PHP 程式碼。
可以為部分變更的 AST 保留格式。
遍歷和修改 AST 的基礎設施。
命名空間名稱的解析。
常量表達式的求值。
用於簡化程式碼產生的 AST 建置的建構器。
將 AST 轉換為 JSON 並返回。
使用 Composer 安裝庫:
php composer.phar require nikic/php-parser
將一些 PHP 程式碼解析為 AST 並將結果轉儲為人類可讀的形式:
<?phpuse PhpParserError;use PhpParserNodeDumper;use PhpParserParserFactory;$code = <<<'CODE'<?phpfunction test($foo){ var_dump($foo);}CODE;$parser = (new-Factorsery()))) ();嘗試{$ast = $parser->parse($code); } catch (Error $error) {echo "解析錯誤:{$error->getMessage()}n";return; }$dumper = new NodeDumper;echo $dumper->dump($ast) 。 “n”;
這會轉儲一個看起來像這樣的 AST:
array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) flags: 0 type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( name: var_dump ) args: array( 0: Arg( name: null value: Expr_Variable( name: foo ) byRef: false unpack: false ) ) ) ) ) ) )
讓我們遍歷 AST 並執行某種修改。例如,刪除所有函數體:
use PhpParserNode;use PhpParserNodeStmtFunction_;use PhpParserNodeTraverser;use PhpParserNodeVisitorAbstract;$traverser = new NodeTraverser();$traverser->addVisitor(new class extends NodeVisitorstract {public function Enter.(清理函數body$node->stmts = []; } } });$ast = $traverser->traverse($ast);echo $dumper->dump($ast) 。 “n”;
這給了我們一個 AST,其中Function_::$stmts
為空:
array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( ) ) )
最後,我們可以將新的 AST 轉換回 PHP 程式碼:
使用 PhpParserPrettyPrinter;$prettyPrinter = new PrettyPrinterStandard;echo $prettyPrinter->prettyPrintFile($ast);
這給了我們原始程式碼,減去函數內的var_dump()
呼叫:
<?php函數測試($foo) { }
如需更全面的介紹,請參閱文件。
介紹
基本組件的使用
組件文件:
走 AST
節點訪客
修改訪客的 AST
短路遍歷
交錯訪客
簡單的節點查找API
父母和兄弟姊妹的參考資料
名稱解析
名稱解析器選項
名稱解析上下文
漂亮的印刷
將 AST 轉換回 PHP 程式碼
自訂格式
格式保留程式碼轉換
AST 建造者
AST 節點的流暢建構器
詞法分析器
模擬
代幣、位置和屬性
錯誤處理
錯誤的列訊息
錯誤恢復(語法錯誤代碼的解析)
常量表達式求值
評估常數/屬性/等初始值設定項
處理錯誤和不支援的表達式
JSON 表示
AST 的 JSON 編碼和解碼
表現
禁用 Xdebug
重複使用物件
垃圾收集影響
常見問題
父母和兄弟姊妹的參考資料