鍍金池/ 教程/ PHP/ 強(qiáng)制模塊依賴
ext_skel生成器
構(gòu)建并編譯一個宿主應(yīng)用
總結(jié)
小結(jié)
小結(jié)
小結(jié)
編譯前的準(zhǔn)備
變量的存儲方式
強(qiáng)制模塊依賴
編譯我們的擴(kuò)展
庫的查找
讓我們從SAPI開始
Unix/Linux平臺下的編譯
小結(jié)
函數(shù)的參數(shù)
zendparseparameters
PHP語言中的超級全局變量(Superglobals)
同時擴(kuò)展和嵌入
線程安全
變量的值
啟動與終止的那點事
一個擴(kuò)展的基本結(jié)構(gòu)
資源自有的引用計數(shù)
小結(jié)
創(chuàng)建PHP變量
有趣的流
一個特殊的參數(shù):return_value
設(shè)置宿主環(huán)境
小結(jié)
關(guān)于生命周期
變量的檢索
內(nèi)存管理
狀態(tài)與屬性讀取
Persistent Resources
Autoconf
小結(jié)
PHP編譯前的config配置
函數(shù)返回值
PHP中的面向?qū)ο螅ㄒ唬?/span>
PHP擴(kuò)展中的全局變量
嵌入式SAPI
通過嵌入包裝重新創(chuàng)建cli
小結(jié)
在Win32平臺上編譯PHP
小結(jié)
老技術(shù)新用
過濾器
MINFO與phpinfo
zendclassentry
編寫函數(shù)
PHP中的資源類型
實現(xiàn)wrapper
引用計數(shù)
小結(jié)
變量的類型
流的概覽
PHP中的面向?qū)ο螅ǘ?/span>
擴(kuò)展生成器
覆寫INI_SYSTEM和INI_PERDIR選項
捕獲輸出
小結(jié)
回調(diào)到php中
PHP的啟動與終止
定義一個接口
初始化php
配置編譯環(huán)境
PHP Streams的本質(zhì)
小結(jié)
類的繼承與接口的實現(xiàn)
讀寫ini配置
定義一個類
小結(jié)
PHP的生命周期
流的上下文
引用與函數(shù)的執(zhí)行結(jié)果
類型轉(zhuǎn)換
小結(jié)
Array與HashTable
PECL_Gen
復(fù)合類型的數(shù)據(jù)——資源
小結(jié)
小結(jié)
數(shù)組(C中的)與鏈表
PHP的生命周期
讀寫對象的屬性
PHP變量在內(nèi)核中的實現(xiàn)
Manipulation
高級嵌入式
操作HashTable的API
流式訪問
Arg Info 與類型綁定
小結(jié)
在內(nèi)核中操作PHP語言中數(shù)組
第一個擴(kuò)展
流的封裝——wrapper
配置和鏈接
流的實現(xiàn)
PHP的生命周期
生成對象的實例與調(diào)用方法
錯誤處理
INI設(shè)置
靜態(tài)編譯
小結(jié)
內(nèi)存管理
Static Stream Operations
常量

強(qiáng)制模塊依賴

在php 5.1中, 擴(kuò)展之間的內(nèi)部依賴是可以強(qiáng)制性的. 由于擴(kuò)展可以靜態(tài)構(gòu)建到php中, 也可以構(gòu)建為共享對象動態(tài)加載, 因此強(qiáng)制依賴需要在兩個地方實現(xiàn).

配置時模塊依賴

第一個位置是你在本章課程中剛剛看到的config.m4文件中. 你可以使用PHP_ADD_EXTENSION_DEP(extname, depname[ , optional])宏標(biāo)識extname這個擴(kuò)展依賴于depname這個擴(kuò)展. 當(dāng)extname以靜態(tài)方式構(gòu)建到php中時, ./configure腳本將使用這一行代碼確認(rèn)depname必須首先初始化. optional參數(shù)是一個標(biāo)記, 用來標(biāo)識depname如果也是靜態(tài)構(gòu)建的, 應(yīng)該在extname之前加載, 不過它并不是必須的依賴.

這個宏的一個使用示例是pdo驅(qū)動, 比如pdo_mysql是可預(yù)知依賴于pdo擴(kuò)展的:

ifdef([PHP_ADD_EXTENDION_DEP],
[
  PHP_ADD_EXTENSION_DEP(pdo_mysql, pdo)
])

要注意PHP_ADD_EXTENSION_DEP()宏被包裹到一個ifdef()結(jié)構(gòu)中. 這是因為pdo和它的驅(qū)動在編譯大于或等于5.0版本的php時都是存在的, 然而PHP_ADD_EXTENSION_DEP()宏是直到5.1.0版本才出現(xiàn)的.

運行時模塊依賴

另外一個你需要注冊依賴的地方是zend_module_entry結(jié)構(gòu)體中. 考慮下面第5章中你定義的zend_module_entry結(jié)構(gòu)體:

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部分進(jìn)行一些小修改:

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
};

現(xiàn)在, 如果ZEND_MODULE_API_NO高于php 5.1.0 beta發(fā)布版, 則STANDARD_MODULE_HEADER(譯注: 這里原著筆誤為STANDARD_MODULE_PROPERTIES)將被替換為略微復(fù)雜的結(jié)構(gòu), 它將包含一個指向模塊依賴信息的引用.

這個目標(biāo)結(jié)構(gòu)體可以在你的zend_module_entry結(jié)構(gòu)體上面定義如下:

#if ZEND_MODULE_API_NO >= 220050617
static zend_module_dep php_sample_deps[] = {
    ZEND_MODULE_REQUIRED("zlib")
    {NULL,NULL,NULL}
};
#endif

和zend_function_entry向量類似, 這個列表可以有多項依賴, 按照順序進(jìn)行檢查. 如果嘗試加載某個依賴模塊未滿足, Zend將會中斷加載, 報告不滿足依賴的名字, 這樣, 終端用戶就可以通過首先加載其他模塊來解決問題.

上一篇:小結(jié)下一篇:操作HashTable的API