# 强制模块依赖

在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. 强制模块依赖相关推荐

  1. 【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )

    文章目录 一.查询 Android 依赖库的配置 二.通过 ModuleDependency#transitive 依赖传递设置 三.通过 ModuleDependency#exclude 设置排除子 ...

  2. 陷阱:C++模块之间的”直接依赖“和”间接依赖“与Makefile的撰写

    参考:http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/ 参考:http://stackoverflow ...

  3. 多模块下依赖其他模块(例如Common模块)时的解决办法

    在多模块下,使用Knife4j进行接口测试时发现,全局异常处理器无法捕获自定义异常,经检查,已经在该模块下的依赖文件中引入相关模块,但是在返回给前端数据时,对于错误的请求返回的还是 message:I ...

  4. AS--›Gradle 自动查找依赖版本冲突,强制指定依赖版本号

    一个工程, 依赖的第三方包越来越多的时候, 肯定是会出现多个包同时引入了同一个库的不同版本. 如果不出问题, 大部分同学应该不会注意到版本冲突的问题, 但是本着对代码负责的原则, 我们还是需要主动解决 ...

  5. python ansible模块_ansible常用模块

    一.ansible常用模块 模块是Ansible执行的最小单位,可以是由Python编写,也可以是Shell编写,也可以是由其他语言编写. 一.ping模块 测试连接可通性,没有参数.通的话返回pon ...

  6. python如何自定义模块_python自定义模块和开源模块使用方法

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  7. 架构设计之依赖倒置、控制反转与依赖注入

    名词解释 依赖:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A依赖于类B. 耦合:一种模型元素之间的关系的描述.例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系. ...

  8. python hashlib模块_python3 hashlib模块

    Python3 hashlib模块和hmac 模块(加密) hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha ...

  9. Python引用模块和查找模块路径

    这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语 ...

  10. Maven最佳实践 划分模块 配置多模块项目 pom modules

    所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...

最新文章

  1. 《Git in Practice》作者访谈:关于Git的八个问题
  2. sql server 按时间段查询
  3. hibernate mysql 模糊查询_服务器-hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到...
  4. N551JM集显和独显切换
  5. 变相裁员??全员营销!程序员被要求卖房~
  6. 案例:演示JDBC的使用
  7. VB制作OCX控件的步骤
  8. 大数据可视化平台有什么优势
  9. 《Android 面试指南》
  10. spring boot+mybatis+quartz项目的搭建
  11. IEEE1588 同步机制
  12. 软考中级软件设计师--11.结构化开发
  13. html5实现对试题图片批改效果,类似盖章效果
  14. python自动qq群发_自动给qq好友发消息
  15. 如何使用在线MP3工具简单剪切音乐
  16. mysql 计算农历_计算农历日期函数
  17. Java程序员的薪资取决于工作年限还是技术?
  18. 万洲金业:白银继续走高,预期缓慢冲高
  19. android系统手机流量控制方法amp;,基于Android的手机流量控制软件全解.doc
  20. 在线云html排版,云标签,关键字图排版 html5 canvas版

热门文章

  1. Unity3d发布webplayer 部署到IIS
  2. 【tool】构造朴实的测试用例
  3. 看书看困了,写几句提提精神
  4. MFC 创建快捷方式(学习笔记)
  5. 数据结构电视大赛投票系统
  6. ArcGIS 道路线数据处理与拓扑操作
  7. Python 字典或JSON模拟数据库的增删改查
  8. android实现填空模式
  9. 网络和新媒体能申请计算机硕士吗,网络与新媒体专业可以报考公务员吗
  10. java SimpleDateFormat类浅析