Php依赖其他模块,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扩展的:
```c
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结构体:
```c
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部分进行一些小修改:
```c
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结构体上面定义如下:
```c
#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
* [目录]()
* 17.2 [库的查找](<17.2.md>)
* 17.4 [Windows方言](<17.4.md>)
Php依赖其他模块,3. 强制模块依赖相关推荐
- 【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )
文章目录 一.查询 Android 依赖库的配置 二.通过 ModuleDependency#transitive 依赖传递设置 三.通过 ModuleDependency#exclude 设置排除子 ...
- 陷阱:C++模块之间的”直接依赖“和”间接依赖“与Makefile的撰写
参考:http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/ 参考:http://stackoverflow ...
- 多模块下依赖其他模块(例如Common模块)时的解决办法
在多模块下,使用Knife4j进行接口测试时发现,全局异常处理器无法捕获自定义异常,经检查,已经在该模块下的依赖文件中引入相关模块,但是在返回给前端数据时,对于错误的请求返回的还是 message:I ...
- AS--›Gradle 自动查找依赖版本冲突,强制指定依赖版本号
一个工程, 依赖的第三方包越来越多的时候, 肯定是会出现多个包同时引入了同一个库的不同版本. 如果不出问题, 大部分同学应该不会注意到版本冲突的问题, 但是本着对代码负责的原则, 我们还是需要主动解决 ...
- python ansible模块_ansible常用模块
一.ansible常用模块 模块是Ansible执行的最小单位,可以是由Python编写,也可以是Shell编写,也可以是由其他语言编写. 一.ping模块 测试连接可通性,没有参数.通的话返回pon ...
- python如何自定义模块_python自定义模块和开源模块使用方法
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- 架构设计之依赖倒置、控制反转与依赖注入
名词解释 依赖:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A依赖于类B. 耦合:一种模型元素之间的关系的描述.例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系. ...
- python hashlib模块_python3 hashlib模块
Python3 hashlib模块和hmac 模块(加密) hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha ...
- Python引用模块和查找模块路径
这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语 ...
- Maven最佳实践 划分模块 配置多模块项目 pom modules
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...
最新文章
- 《Git in Practice》作者访谈:关于Git的八个问题
- sql server 按时间段查询
- hibernate mysql 模糊查询_服务器-hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到...
- N551JM集显和独显切换
- 变相裁员??全员营销!程序员被要求卖房~
- 案例:演示JDBC的使用
- VB制作OCX控件的步骤
- 大数据可视化平台有什么优势
- 《Android 面试指南》
- spring boot+mybatis+quartz项目的搭建
- IEEE1588 同步机制
- 软考中级软件设计师--11.结构化开发
- html5实现对试题图片批改效果,类似盖章效果
- python自动qq群发_自动给qq好友发消息
- 如何使用在线MP3工具简单剪切音乐
- mysql 计算农历_计算农历日期函数
- Java程序员的薪资取决于工作年限还是技术?
- 万洲金业:白银继续走高,预期缓慢冲高
- android系统手机流量控制方法amp;,基于Android的手机流量控制软件全解.doc
- 在线云html排版,云标签,关键字图排版 html5 canvas版