尼基克/php解析器

用PHP编写的PHP解析器

安装以下为:566235361

受抚养人以下为:1485

建议者以下为:27

安全以下为:0

星星以下为:16778

观察者以下为:232

叉子以下为:1072

未决问题以下为:39

5.0.2版 2024-03-05 20:51 UTC(世界协调时)

自述文件

覆盖范围状态

这是一个用PHP编写的PHP解析器。其目的是简化静态代码分析和操纵。

5.x版文档(当前;用于在PHP>=7.4上运行;用于解析PHP7.0到PHP8.3,对解析PHP5.x的支持有限)。

4.x版本的文档(支持;用于在PHP>=7.0上运行;用于将PHP5.2解析为PHP8.3)。

特征

该库提供的主要功能包括:

  • 将PHP7和PHP8代码解析为抽象语法树(AST)。
    • 可以将无效代码解析为部分AST。
    • AST包含准确的位置信息。
  • 以人类可读的形式转储AST。
  • 将AST转换回PHP代码。
    • 可以为部分更改的AST保留格式。
  • 用于遍历和修改AST的基础结构。
  • 命名空间名称的解析。
  • 常量表达式的求值。
  • 生成器简化AST构造以生成代码。
  • 将AST转换为JSON并返回。

快速入门

使用安装库作曲家以下为:

php composer.phar需要nikic/php-parser

将一些PHP代码解析为AST并将结果转储为可读形式:

<?php(电话)
使用 Php分析器\错误;使用 PhpParser软件\节点翻转器;使用 PhpParser软件\分析器工厂;$代码=<<<“代码”
<?php(电话)

功能测试($foo)
{
var_dump($foo);
}
代码;$解析器= (新的 分析器工厂())->为最新的受支持版本创建();尝试{$ast公司=$解析器->解析($代码);}抓住(错误 $错误) {回声"分析错误:{$错误->获取消息()}“;返回;}$翻车机=新的 节点翻转器;回声 $翻车机->倾倒($ast公司) . “\n”;

这将转储一个类似于以下内容的AST:

阵列(0:Stmt_Function(标准函数)(attrGroups:数组()byRef:错误name:标识符(名称:测试)参数:数组(0:参数(attrGroups:数组()标志:0类型:nullbyRef:错误变量:false变量:Expr_Variable(名称:foo)默认值:null))returnType:空stmts:数组(0:Stmt_Expression(标准表达式)(expr:expr_FuncCall(表达式_函数调用)(name:名称(名称:var_dump)参数:数组(0:参数(名称:null值:Expr_Variable(名称:foo)byRef:错误解压缩:false)))))))

让我们遍历AST并执行某种修改。例如,删除所有函数体:

使用 PhpParser软件\节点;使用 PhpParser软件\节点\报表\功能_;使用 PhpParser软件\节点传送器;使用 PhpParser软件\节点访问者摘要;$横移器=新的 节点传送器();$横移器->添加访问者(新的  延伸 节点访问者摘要{公众的 功能 enterNode(输入节点)(节点 $节点) {如果($节点运算符功能_) {//清理功能体
            $节点->stmts公司= [];}}});$ast公司=$横移器->导线($ast公司);回声 $翻车机->倾倒($ast公司) . “\n”;

这给了我们一个AST,其中函数_::$stmts为空:

阵列(0:Stmt_Function(标准函数)(attrGroups:数组()byRef:错误name:标识符(名称:测试)参数:数组(0:参数(attrGroups:数组()类型:nullbyRef:错误变量:false变量:Expr_Variable(名称:foo)默认值:null))returnType:空stmts:数组()))

最后,我们可以将新的AST转换回PHP代码:

使用 PhpParser软件\Pretty打印机;$漂亮打印机=新的 Pretty打印机\标准;回声 $漂亮打印机->pretty打印文件($ast公司);

这是我们的原始代码,减去var_dump()在函数内部调用:

<?php(电话)

功能 测试($foo公司){}

有关更全面的介绍,请参阅文档。

文档

  1. 介绍
  2. 基本组件的使用

组件文档:

  • 行走AST
    • 节点访问者
    • 从访问者修改AST
    • 短路导线
    • 交错的访客
    • 简单节点查找API
    • 父引用和同级引用
  • 名称解析
    • 名称解析程序选项
    • 名称解析上下文
  • 印刷精美
    • 将AST转换回PHP代码
    • 自定义格式
    • 格式-保存代码转换
  • AST建设者
    • AST节点的流畅构建器
  • 莱克瑟
    • 仿真
    • 标记、位置和属性
  • 错误处理
    • 错误的列信息
    • 错误恢复(语法错误代码的解析)
  • 常量表达式求值
    • 计算常量/属性/etc初始值设定项
    • 处理错误和不支持的表达式
  • JSON表示
    • AST的JSON编码和解码
  • 性能
    • 禁用Xdebug
    • 重用对象
    • 垃圾收集影响
  • 常见问题
    • 父引用和同级引用