genExtension() 是流水线里最大的一块生成逻辑,产出 extension-<target>.cc——一个标准 Zend 扩展模块。它把前面收集的所有类、函数、常量、全局变量缝合进 Zend 的生命周期钩子(MINIT / MINIT / RINIT / RSHUTDOWN)。
Sources: src/Translator.php
flowchart TD
A["extension-<target>.cc"] --> B["全局变量 / 类表 / 函数表 / 属性表 声明"]
B --> C["php_get_class / php_get_func / php_get_method / php_get_prop"]
C --> D["ext_functions[] (ZEND_FE 列表)"]
D --> E["PHP_MINIT: 注册类/反射处理器/符号"]
E --> F["PHP_RINIT: php_app_init + eval(main)"]
F --> G["PHP_RSHUTDOWN: php_app_clean + request_shutdown"]
G --> H["zend_module_entry"]
Sources: src/Translator.php
php_get_class / php_get_func / php_get_method / php_get_prop 用缓存的 class_map / func_map / prop_map 把字符串名映射到运行时 zend_class_entry / zend_function,带 UNEXPECTED 快路径。registerSymbols 函数。php_app_init() 注册常量、全局变量、静态属性、类数组常量;bin 模式下 php::eval 执行 main()(按 $argc/$argv 或空参两种签名)。php_app_clean() 清理全局变量、VAR 常量、类数组常量(含继承来的数组常量),ext 模式额外清空三张映射表以支持模块重载。Sources: src/Translator.php · src/Translator.php
bin:嵌入 cli_set_process_title,RINIT 直接跑 main();lib:Linux 下导出 save_ps_args 占位符;getModuleName() 仍生成模块入口;ext:用 ZEND_GET_MODULE(),跳过 main(),RSHUTDOWN 清空映射表。Sources: src/Translator.php · src/Translator.php