本文案例的編譯環境爲linux (ubuntu),php5.5.5,netbeans7.4。win系列系統因爲做者不熟悉,還請讀者百度,谷歌。
php
下載PHP源碼,cd 你的目錄/php5.5.5/ext,這個目錄之下會有PHP的大部分擴展,能夠作爲參考。ext目錄會有一個擴展生的一個名爲ext_skel的shell腳本,執行命令./ext_skel --extname=xcz將爲你生成一個xcz的PHP擴展的目錄。進入這個目錄,"PHP安裝目錄"/bin/phpize 將爲你生成一個configure的文件,./configure --with-php-config 使用這個命令將爲你生成make等文件,這個時候就能夠使用netbeans打開這個擴展了。爲何netbeans呢?使用這個ide能夠幫你找到相應的ZEND API linux
找開xcz.c找到const zend_function_entry xcz_functions[] 這行修改爲:shell
const zend_function_entry xcz_functions[] = {/* For testing, remove later. */ PHP_FE_END/* Must be the last line in xcz_functions[] */ };
刪除掉了默認生成那個亂78糟的方法,打開php_xcz.hubuntu
刪除ide
PHP_FUNCTION(confirm_xcz_compiled);
其實不刪除也不要緊,只是做者有強迫症,不想讓這個C作太多的事情,只是作一些簡單的版本聲明,初始化等。spa
新建cz.c,cz.h 打開cz.h加入以下代碼:
code
/* * File: cz.h * Author: luxixi * * Created on December 31, 2013, 2:20 PM */ /** ZEND_BEGIN_MODULE_GLOBALS(xcz) long global_value; char *global_string; ZEND_END_MODULE_GLOBALS(xcz) */ PHP_METHOD(Cz, __construct); PHP_METHOD(Cz, createApp);
打開cz.c rem
/* * File: one.h * Author: luxixi * * Created on December 31, 2013, 4:00 PM */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_xcz.h" #include "cz.h" zend_class_entry *cz_cz_ce; const zend_function_entry cz_class_functions[]={ PHP_ME(Cz, __construct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(Cz,createApp,NULL,ZEND_ACC_PUBLIC) PHP_FE_END }; PHP_MINIT_FUNCTION(cz) { zend_class_entry ce; memset(&ce, 0, sizeof(zend_class_entry)); INIT_CLASS_ENTRY(ce,"Cz",cz_class_functions); cz_cz_ce = zend_register_internal_class_ex(&ce,NULL,NULL TSRMLS_CC); /* cz_cz_ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; * */ zend_declare_property_null(cz_cz_ce,ZEND_STRL("_cz"),ZEND_ACC_PUBLIC TSRMLS_CC); } PHP_METHOD(Cz,__construct) { zend_printf("The is Cz class __construct!!</br>"); } PHP_METHOD(Cz,createApp) { zend_printf("The is Cz lcass createApp !</br>"); }
打開xcz.c找到PHP_MINIT_FUNCTION方法,加入如下代碼:源碼
ZEND_MODULE_STARTUP_N(cz) (INIT_FUNC_ARGS_PASSTHRU); /**ZEND_MODULE_STARTUP_N(cz) cz和cz.c PHP_MINIT_FUNCTION(cz)中的cz,若是沒加入這代碼,cz.c中的方法將不能夠使用,若是參數不對應,編譯時不會報錯,但在啓動PHP時會提示 undefined symbol: zm_startup_cz */
如今修改config.m4 找到PHP_NEW_EXTENSION方法,在xcz.c加面加空格cz.c。string
/php安裝目錄/bin/phpize
./configure --with-php-config=/php安裝目錄/bin/php-config
make
make install
修改php.ini 加入extension=xcz.so
使用php代碼:
$cz = new \Cz(); $cz->createApp();
將會輸出The is Cz class __construct!! The is Cz lcass createApp !
使用cz一個方法建立別一個類。每建立一個記獲得xcz.c中PHP_MINIT_FUNCTION加入一行
ZEND_MODULE_STARTUP_N(cz) (INIT_FUNC_ARGS_PASSTHRU);
如建立一個one.c而且PHP_MINIT_FUNCTION(one)就在xcz.c的PHP_MINIT_FUNCTION中入
ZEND_MODULE_STARTUP_N(one) (INIT_FUNC_ARGS_PASSTHRU);
第一次寫博文,寫得很差還請見諒。有興趣的朋友能夠加入QQ羣:239505116 一塊兒討論。