nikic / php-parser
用PHP编写的PHP解析器
v5.2.0
2024-09-15 16:40 UTC
Requires (Dev)
- ircmaxell/php-yacc: ^0.0.7
- phpunit/phpunit: ^9.0
- v5.2.0
- v5.1.0
- dev-master / 5.0.x-dev
- v5.0.2
- v5.0.1
- v5.0.0
- v5.0.0rc1
- v5.0.0beta1
- v5.0.0alpha3
- v5.0.0alpha2
- v5.0.0alpha1
- 4.x-dev
- v4.19.2
- v4.19.1
- v4.19.0
- v4.18.0
- v4.17.1
- v4.17.0
- v4.16.0
- v4.15.5
- v4.15.4
- v4.15.3
- v4.15.2
- v4.15.1
- v4.15.0
- v4.14.0
- v4.13.2
- v4.13.1
- v4.13.0
- v4.12.0
- v4.11.0
- v4.10.5
- v4.10.4
- v4.10.3
- v4.10.2
- v4.10.1
- v4.10.0
- v4.9.1
- v4.9.0
- v4.8.0
- v4.7.0
- v4.6.0
- v4.5.0
- v4.4.0
- v4.3.0
- v4.2.5
- v4.2.4
- v4.2.3
- v4.2.2
- v4.2.1
- v4.2.0
- v4.1.1
- v4.1.0
- v4.0.4
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- v4.0.0beta1
- v4.0.0alpha3
- v4.0.0alpha2
- v4.0.0alpha1
- 3.x-dev
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v3.0.0beta2
- v3.0.0beta1
- v3.0.0alpha1
- 2.x-dev
- v2.1.1
- v2.1.0
- v2.0.1
- v2.0.0
- v2.0.0beta1
- v2.0.0alpha1
- 1.x-dev
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.0
- v1.0.2
- v1.0.1
- v1.0.0
- v1.0.0beta2
- v1.0.0beta1
- 0.9.x-dev
- v0.9.5
- v0.9.4
- v0.9.3
- v0.9.2
- v0.9.1
- v0.9.0
- dev-tokens-experiment
This package is auto-updated.
Last update: 2024-09-21 18:58:37 UTC
README
这是一个用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,并以人类可读的形式转储结果
<?php use PhpParser\Error; use PhpParser\NodeDumper; use PhpParser\ParserFactory; $code = <<<'CODE' <?php function test($foo) { var_dump($foo); } CODE; $parser = (new ParserFactory())->createForNewestSupportedVersion(); try { $ast = $parser->parse($code); } catch (Error $error) { echo "Parse error: {$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 PhpParser\Node; use PhpParser\Node\Stmt\Function_; use PhpParser\NodeTraverser; use PhpParser\NodeVisitorAbstract; $traverser = new NodeTraverser(); $traverser->addVisitor(new class extends NodeVisitorAbstract { public function enterNode(Node $node) { if ($node instanceof Function_) { // Clean out the 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代码
use PhpParser\PrettyPrinter; $prettyPrinter = new PrettyPrinter\Standard; echo $prettyPrinter->prettyPrintFile($ast);
这将给我们原始代码,但函数内部的 var_dump()
调用已被删除
<?php function test($foo) { }
对于更全面的介绍,请参阅文档。
文档
组件文档