mrsuh / php-parser
用PHP编写的PHP解析器
v95.1.0
2024-08-02 14:35 UTC
Requires (Dev)
- ircmaxell/php-yacc: ^0.0.7
- phpunit/phpunit: ^9.0
- v95.1.0
- v95.0.2
- v94.18.0
- v94.17.0
- v94.16.0
- v94.15.5
- v94.15.4
- v94.14.0
- v94.13.3
- v94.13.2
- v94.13.1
- v94.13.0
- dev-master / 5.0.x-dev
- v4.12.1
- 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-generics-support
- dev-fix-readony-dnf
- dev-tokens-experiment
- dev-nameString
- dev-attributes
This package is auto-updated.
Last update: 2024-09-02 14:56:28 UTC
README
这是一个用PHP编写的PHP解析器。它的目的是简化静态代码分析和操作。
5.x版本的文档(当前版本;适用于PHP >= 7.4;解析PHP 7.0到PHP 8.3,对解析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";
这给我们一个空Function_::$stmts
的AST
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) { }
有关更全面的介绍,请参阅文档。
文档
组件文档