TypePHP 编译器 https://swoole.com/aot/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

48 lines
2.1 KiB

<blog>
# 函数与类生成
本章聚焦两个最频繁的发射动作:`genFunctionWrapper()`(函数/方法 → C++ 函数)与 `genClassWrapper()`(类/接口/枚举 → C++ 类与 zend_class_entry 注册)。
Sources: [src/Translator.php](src/Translator.php#L2515-L2528)
## 函数生成
`genFunctionDeclarations()` 为每个 `FunctionDef` 生成前向声明,规则包括:
- **方法**:首参加 `php::Object &this_`;trait 父类场景追加 `zend_class_entry *trait_parent_ce`
- **变参**:声明为 `php::Array` 并附默认参数表达式;
- **多返回**:在 `typephp_multi_return` 命名空间再生成一份返回元组版本(`hasMultiReturn()`);
- **热/冷路径**:`hot`/`cold` 加 `TYPEPHP_HOT_ATTRIBUTE` / `TYPEPHP_COLD_ATTRIBUTE`
- **导入/导出**:跨库函数用 `TYPEPHP_<LIB>_IMPORT` 宏,库导出函数用 `TYPEPHP_<NAME>_API`
Sources: [src/Translator.php](src/Translator.php#L1740-L1830)
## 类生成
`genClassWrapper()` 为每个 `ClassDef` / `InterfaceDef` 生成:
1. C++ 类结构与属性布局;
2. 静态属性默认值(`php::setStaticProperty`);
3. `create_object` 钩子与属性处理器安装(`genClassPropertyInit()`);
4. 数组常量(`genClassArrayConstants()`)。
属性初始化分两种情况([src/Translator.php](src/Translator.php#L1909-L1963)):
- **标量/常量默认值**:包成 `php::Var` 写入属性表;
- **数组默认值**:用 `ArrayInitPlan` 生成构造表达式,避免重复求值。
Sources: [src/Translator.php](src/Translator.php#L1894-L1966) · [src/Preprocessor.php](src/Preprocessor.php#L974-L1002)
## 类注册排序
`genClassCeList()``marcj/topsort` 按继承依赖拓扑排序生成 `zend_class_entry` 注册顺序,确保父类先于子类注册;内置类/接口(不在符号表中)直接加入排序而不参与依赖解析。
Sources: [src/Translator.php](src/Translator.php#L2539-L2568)
## 相关阅读
- 所有声明头如何汇总 → [生成器总览](generator)
- 模块入口如何引用这些符号 → [扩展模块生成](gen-extension)
- 属性类型约束 → [原生类型映射](native-types)
</blog>