PHP语言C扩展--创建多个类
PHP语言C扩展--创建多个类
信念永恒 发表于4年前
PHP语言C扩展--创建多个类
  • 发表于 4年前
  • 阅读 677
  • 收藏 11
  • 点赞 2
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 在写PHP扩展时如果一个C文件类写这多个类或方法,难免会模糊不清,增加维护难度。下面的文章將告诉如何解决这个问题。 c语言:cz.c ---- PHP语言Cz class. c语言:one.c ---- PHP语言one class. (文笔不好是软肋)

     本文案例的编译环境为linux (ubuntu),php5.5.5,netbeans7.4。win系列系统由于作者不熟悉,还请读者百度,谷歌。

     下载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 

     找开xcz.c找到const zend_function_entry xcz_functions[] 这行修改成:

const zend_function_entry xcz_functions[] = {/* For testing, remove later. */
     PHP_FE_END/* Must be the last line in xcz_functions[] */
};

删除掉了默认生成那个乱78糟的方法,打开php_xcz.h

删除

PHP_FUNCTION(confirm_xcz_compiled);

其实不删除也没关系,只是作者有强迫症,不想让这个C做太多的事情,只是做一些简单的版本声明,初始化等。

新建cz.c,cz.h 打开cz.h加入如下代码:

/* 
 * 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 

/* 
 * 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。

/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 一起讨论。

共有 人打赏支持
粉丝 6
博文 4
码字总数 1830
×
信念永恒
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: