AST 转换(Lowering)

doConvert() 遍历 AST 时,src/Transform/Visitor.php 作为 NodeVisitor 挂载在遍历链上,对节点做编译期改写(lowering)——把 PHP 8.x 的高层语法(属性钩子、构造函数提升、getter、编译期属性等)降级为编译器能直接翻译的普通结构。

Sources: src/Transform/Visitor.php · src/Translator.php

两个遍历钩子

Visitor 实现 enterNode()leaveNode() 两阶段处理:

Sources: src/Transform/Visitor.php

Lowering 算子清单

作用
CompileTimeAttribute / CompileTimeAttributeRegistry识别并校验编译期属性(如 AnyMustUse
FunctionAttributeLowering处理函数上的编译期属性
ConstructorLowering处理构造函数提升参数
GetterLoweringget 钩子属性 → getter 方法
PropertyHookLoweringget/set 钩子属性 → 访问器方法
PropertyMethodLowering属性 ↔ 方法互转
ParameterValidationLowering参数类型校验,拒绝箭头函数误用
PrinterLowering / ValidateLowering打印/校验相关降级
ArrayableLowering / NotEmptyLowering / NotNullLowering特定表达式降级
RuntimeAttributeFactoryLowering运行时工厂属性(遍历链上独立挂载)

Sources: src/Transform/ · src/Translator.php

顺序意义

Lowering 必须早于 C++ 生成:例如属性钩子若不先降级成方法,后续 genClassWrapper 就无法生成对应的 C++ 访问逻辑。它处在 解析器与 AST 之后、代码生成 之前。

相关阅读