擴展生成
毫無疑問你已經注意到, 每個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>[email protected]</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文件中.