Php依赖其他模块,17.3 强制模块依赖

# 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值