关键在于改得准、扩得稳,AST将PHP代码解析为可导航树结构,通过Visitor模式精准修改节点,并结合框架语义与PHP 8.4新特性实现安全自动重构。

用AST做PHP框架的自动重构,关键不在“能不能”,而在“改得准不准、扩得稳不稳”。它不是简单替换字符串,而是把代码当结构来读、当对象来改——这正是Rector、PHP-Parser这类工具能落地的核心。
理解AST:代码不是文本,是可导航的树
PHP源码经词法分析→语法分析后,生成的是节点组成的树(如 Stmt_Function、Expr_BinaryOp),每个节点带类型、子节点、行号等元信息。比如 return $a + $b; 不会被当成一行字符处理,而是拆成 Return 语句节点 → BinaryOp 节点 → 变量节点 $a 和 $b。这意味着你可以精准定位“所有二元加法中左操作数为 $user_id 的地方”,而不会误伤注释或字符串里的 “+”。
- 用
nikic/php-parser解析任意PHP文件,得到array形式的 AST 根节点 - 节点类型严格对应 PHP 内部 AST 常量(如
ZEND_AST_ASSIGN映射为Stmt_Assign) - 修改必须通过节点实例操作(如
$node->expr = new Expr_ConstFetch(...)),而非字符串拼接
写安全的重构规则:从 Visitor 到 Traverser
真正批量改代码,靠的是访问者(Visitor)配合遍历器(Traverser)。你定义一个类继承 NodeVisitorAbstract,只重写关心的节点类型方法(如 enterNode(Stmt_Class)),在其中判断条件、替换节点、甚至插入新节点。
-
enterNode()适合做条件检查和前置修改(如记录类名、收集属性) -
leaveNode()更适合做后置计算或返回替换节点(如把new DateTime()替换为date_create()并返回新节点) - 多个 Visitor 可链式注册到同一个
NodeTraverser,实现解耦(如一个负责参数校验,一个负责类型注解迁移)
对接框架特性:不只是语法,更是语义
纯PHP语法重构只是起点。在 Laravel、Symfony 等框架中,很多逻辑藏在配置、注解、服务容器绑定里。AST重构需结合框架约定:
立即学习“PHP免费学习笔记(深入)”;
- Laravel 的
@middleware注解可被解析为Attribute节点,自动迁移到中间件组配置 - Symfony 的
#[Route]属性节点可提取路径与方法,生成独立路由文件 - 识别
$this->dispatch(new Event())模式,批量升级为 EventInterface 类型提示 + 构造注入
适配PHP 8.4:新语法不是障碍,是重构入口
PHP 8.4 引入了只读类(readonly class)、显式协变返回(function foo(): self)、以及更严格的类型推导。这些不是要手动改,而是设计规则自动识别:
- 扫描所有
class X { public $prop; },若无写入操作且含 final 方法,建议转为readonly class - 匹配
function() { return $this; }模式,自动补全协变返回类型: static或: self - Rector 已内置
SetList::PHP_84,但需配合自定义规则过滤框架专属类(如 Eloquent Model 不应加 readonly)



















