PHP語言C擴展--建立多個類

     本文案例的編譯環境爲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 一塊兒討論。

相關文章
相關標籤/搜索