这是一个用 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 ParserFactory())->createForNewestSupportedVersion ();尝试{$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 NodeVisitorAbstract {public function EnterNode(Node $node) {if ($node instanceof Function_) {//清理函数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
重用对象
垃圾收集影响
常见问题
父母和兄弟姐妹的参考资料