phabel / php-parser
用PHP编写的PHP解析器
94.13.2
2021-12-15 13:09 UTC
Requires
- php: >=7.0
- ext-tokenizer: *
Requires (Dev)
- ircmaxell/php-yacc: ^0.0.7
- phpunit/phpunit: ^6.5 || ^7.0 || ^8.0 || ^9.0
- 94.13.2
- v94.10.7
- v94.10.6
- v94.10.5
- 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
- dev-master / 4.9.x-dev
- 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-master-80
- dev-master-74
- dev-master-73
- dev-master-72
- dev-master-71
- dev-master-70
- dev-master-56
- dev-tokens-experiment
- dev-nameString
- dev-attributes
This package is auto-updated.
Last update: 2024-09-15 20:05:22 UTC
README
这是一个用PHP编写的从PHP 5.2到PHP 8.0的解析器。其目的是简化静态代码分析和操作。
4.x版本文档(稳定版;在PHP >= 7.0上运行;解析PHP 5.2到PHP 8.0)。
3.x版本文档(不受支持;在PHP >= 5.5上运行;解析PHP 5.2到PHP 7.2)。
特性
该库提供的主要特性包括
- 将PHP 5、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)->create(ParserFactory::PREFER_PHP7); 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(
byRef: false
name: Identifier(
name: test
)
params: array(
0: Param(
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(
parts: array(
0: var_dump
)
)
args: array(
0: Arg(
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(
byRef: false
name: Identifier(
name: test
)
params: array(
0: Param(
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) { }
对于更全面的介绍,请参阅文档。
文档
组件文档