# 函数与类生成 本章聚焦两个最频繁的发射动作:`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__IMPORT` 宏,库导出函数用 `TYPEPHP__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)