企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 17.3 强制模块依赖 # 强制模块依赖 在php 5.1中, 扩展之间的内部依赖是可以强制性的. 由于扩展可以静态构建到php中, 也可以构建为共享对象动态加载, 因此强制依赖需要在两个地方实现. ## 配置时模块依赖 第一个位置是你在本章课程中刚刚看到的config.m4文件中. 你可以使用PHP\_ADD\_EXTENSION\_DEP(extname, depname\[ , optional\])宏标识extname这个扩展依赖于depname这个扩展. 当extname以静态方式构建到php中时, ./configure脚本将使用这一行代码确认depname必须首先初始化. optional参数是一个标记, 用来标识depname如果也是静态构建的, 应该在extname之前加载, 不过它并不是必须的依赖. 这个宏的一个使用示例是pdo驱动, 比如pdo\_mysql是可预知依赖于pdo扩展的: ``` ifdef([PHP_ADD_EXTENDION_DEP], [ PHP_ADD_EXTENSION_DEP(pdo_mysql, pdo) ]) ``` 要注意PHP\_ADD\_EXTENSION\_DEP()宏被包裹到一个ifdef()结构中. 这是因为pdo和它的驱动在编译大于或等于5.0版本的php时都是存在的, 然而PHP\_ADD\_EXTENSION\_DEP()宏是直到5.1.0版本才出现的. ## 运行时模块依赖 另外一个你需要注册依赖的地方是zend\_module\_entry结构体中. 考虑下面第5章中你定义的zend\_module\_entry结构体: ``` zend_module_entry sample_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_SAMPLE_EXTNAME, php_sample_functions, NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 PHP_SAMPLE_EXTVER, #endif STANDARD_MODULE_PROPERTIES }; ``` 增加运行时模块依赖信息就需要对STANDARD\_MOUDLE\_HEADER部分进行一些小修改: ``` zend_module_entry sample_module_entry = { #if ZEND_MODULE_API_NO >= 220050617 STANDARD_MODULE_HEADER_EX, NULL, php_sample_deps, #elif ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_SAMPLE_EXTNAME, php_sample_functions, NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 PHP_SAMPLE_EXTVER, #endif STANDARD_MODULE_PROPERTIES }; ``` 现在, 如果ZEND\_MODULE\_API\_NO高于php 5.1.0 beta发布版, 则STANDARD\_MODULE\_HEADER(译注: 这里原著笔误为STANDARD\_MODULE\_PROPERTIES)将被替换为略微复杂的结构, 它将包含一个指向模块依赖信息的引用. 这个目标结构体可以在你的zend\_module\_entry结构体上面定义如下: ``` #if ZEND_MODULE_API_NO >= 220050617 static zend_module_dep php_sample_deps[] = { ZEND_MODULE_REQUIRED("zlib") {NULL,NULL,NULL} }; #endif ``` 和zend\_function\_entry向量类似, 这个列表可以有多项依赖, 按照顺序进行检查. 如果尝试加载某个依赖模块未满足, Zend将会中断加载, 报告不满足依赖的名字, 这样, 终端用户就可以通过首先加载其他模块来解决问题. ## links - [目录](preface.md) - 17.2 [库的查找](17.2.html) - 17.4 [Windows方言](17.4.html)