擴充產生
毫無疑問你已經注意到, 每個php擴充都包含一些非常公用的並且非常單調的結構和檔案. 當開始一個新擴充開發的時候, 如果這些公用的結構已經存在, 我們只用考慮填充功能代碼是很有意義的. 為此, 在php中包含了一個簡單但是很有用的shell指令碼.
ext_skel
切換到你的php原始碼樹下ext/目錄中, 執行下面的命令:
jdoe@devbox:/home/jdoe/cvs/php-src/ext/$ ./ext_skel extname=sample7
稍等便可, 輸出一些文本, 你將看到下面的這些輸出:
To use your new extension, you will have to execute the following steps: 1. $ cd .. 2. $ vi ext/sample7/config.m4 3. $ ./buildconf 4. $ ./configure [with|enable]-sample7 5. $ make 6. $ ./php -f ext/sample7/sample7.php 7. $ vi ext/sample7/sample7.c 8. $ make Repeat steps 3-6 until you are satisfied with ext/sample7/config.m4 and step 6 confirms that your module is compiled into PHP. Then, start writing code and repeat the last two steps as often as necessary.
此刻觀察ext/sample7目錄, 你將看到在第5章"你的第一個擴充"中你編寫的擴充骨架代碼的注釋版本. 只是現在你還不能編譯它; 不過只需要對config.m4做少許修改就可以讓它工作了, 這樣你就可以避免第5章中你所做的大部分工作.
產生函數原型
如果你要編寫一個對第三方庫的封裝擴充, 那麼你就已經有了一個函數原型及基本行為的機器刻度版本的描述(標頭檔), 通過傳遞一個額外的參數給./ext_skel, 它將自動的掃描你的標頭檔並建立對應於介面的簡單PHP_FUCNTION()塊. 下面是使用./ext_skel指令解析zlib頭:
jdoe@devbox:/home/jdoe/cvs/php-src/ext/$ ./ext_skel extname=sample8 \proto=/usr/local/include/zlib/zlib.h
現在在ext/sample8/sample8.c中, 你就可以看到許多PHP_FUNCTION()定義, 每個zlib函數對應一個. 要注意, 骨架產生程式會對某些未知資源類型產生警告訊息. 你需要對這些函數特別注意, 並且為了將這些內部的複雜結構體和使用者空間可訪問的變數關聯起來, 可能會需要使用你在第9章"資源資料類型"中學到的知識.
PECL_Gen
還有一種更加完善但也更加複雜的代碼產生器: PECL_Gen, 可以在PECL(http://pecl.php.net)中找到它, 使用pear install PECL_Gen命令可以安裝它.
譯者注: PECL_Gen已經遷移為CodeGen_PECL(http://pear.php.net/package/CodeGen_PECL). 本章涉及代碼測試使用CodeGen_PECL的版本資訊為: "php 1.1.3, Copyright (c) 2003-2006 Hartmut Holzgraefe", 如果您的環境使用有問題, 請參考譯序中譯者的環境配置.
一旦安裝完成, 它就可以像ext_skel一樣運行, 接受相同的輸入參數, 產生大致相同的輸出, 或者如果提供了一個完整的xml定義檔案, 則產生一個更加健壯和完整可編譯版本的擴充. PECL_Gen並不會節省你編寫擴充核心功能的時間; 而是提供一種可選的方式高效的產生擴充骨架代碼.
specfile.xml
下面是最簡單的擴充定義檔案:
<?xml version="1.0" encoding="utf-8" ?> <extension name="sample9"> <functions> <function name="sample9_hello_world" role="public"> <code> <![CDATA[ php_printf("Hello World!"); ]]> </code> </function> </functions> </extension>
譯註: 請注意, 譯者使用的原著中第一行少了後面的問號, 導致不能使用, 加上就OK.
通過PECL_Gen命令運行這個檔案:
jdoe@devbox:/home/jdoe/cvs/php-src/ext/$ pecl-gen specfile.xml
則會產生一個名為sample9的擴充, 並暴露一個使用者空間函數sample9_hello_world().
關於擴充
除了你已經熟悉的功能檔案, PECL_Gen還會產生一個package.xml檔案 它可以用於pear安裝. 如果你計劃發布包到PECL庫, 或者哪怕你只是想要使用pear包系統交付內容, 有這個檔案都會很有用.
總之, 你可以在PECL_Gen的specfile.xml中指定多數package.xml檔案的元素.
<?xml version="1.0" encoding="UTF-8" ?> <extension name="sample9"> <summary>Extension 9 generated by PECL_Gen</summary> <description>Another sample of PHP Extension Writing</description> <maintainers> <maintainer> <name>John D. Bookreader</name> <email>jdb@example.com</email> <role>lead</role> </maintainer> </maintainers> <release> <version>0.1</version> <date>2006-01-01</date> <state>beta</state> <notes>Initial Release</notes> </release> ... </extension>
當PECL_Gen建立擴充時, 這些資訊將被翻譯到最終的package.xml檔案中.