PHP扩展实现类

时间:2017-05-27作者:klpeng分类:PHP浏览:2171评论:0

之前有一篇文章写了一个最简单的PHP扩展示例,只是单个函数,打印输出,今天介绍一下,如何用PHP扩展,来创建一个类.

创建骨架啥的就不继续介绍了,不会的可以去看下我之前的文章>>最简单的PHP扩展示例

重点介绍一下代码,这次我创建的扩展名叫 klpeng,里面定义了一个类'klpeng',类的public属性'something',以及类的方法'study()',下面来看步骤:

第一步,编辑php_klpeng.h,加入方法声明:

PHP_METHOD(klpeng,study);


第二步,方法实现,编辑klpeng.c,下面是study方法的实现:

PHP_METHOD(klpeng, study) {
    char *chao = NULL;
    int chao_len;
    zval *value, *self;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chao, &chao_len) == FAILURE) {
        WRONG_PARAM_COUNT;
    }
    self = getThis();
    MAKE_STD_ZVAL(value);
    ZVAL_STRING(value, chao, chao_len);
    SEPARATE_ZVAL_TO_MAKE_IS_REF(&value);
    zend_update_property(Z_OBJCE_P(self), self, ZEND_STRL("something"), value TSRMLS_CC);
}

简单解释下这段代码:用zend_parse_parameters()函数获取方法的参数,getThis()函数获取this的指针,用MAKE_STD_ZVAL()宏初始化了一个zval结构value,用zend_update_property()函数来更新something属性的值。


第三步:在扩展初始化函数中,注册并初始化类:

zend_class_entry * klpeng_ce;
PHP_MINIT_FUNCTION(klpeng) {
    /* If you have INI entries, uncomment these lines 
      REGISTER_INI_ENTRIES();
     */
    zend_class_entry ce;
    INIT_CLASS_ENTRY(ce, "klpeng", klpeng_functions);
    klpeng_ce = zend_register_internal_class(&ce);
    zend_declare_property_null(klpeng_ce, "something", sizeof("something") - 1, ZEND_ACC_PUBLIC);
    return SUCCESS;
}

这段代码里面我们使用INIT_CLASS_ENTRY()宏初始化类指定了类名为'klpeng',指定了函数列表klpeng_functions,并且声明了一个名称为something的属性,设置其访问类型为public。


第四步:声明方法的参数,并注册到函数表中:

ZEND_BEGIN_ARG_INFO(arg_klpeng_study, 0)
    ZEND_ARG_INFO(0,something)
ZEND_END_ARG_INFO()

const zend_function_entry klpeng_functions[] = {
    PHP_ME(klpeng,study,arg_klpeng_study,ZEND_ACC_PUBLIC)
    {NULL,NULL,NULL}
};

注意每个arg info结构的参数声明都是通过ZEND_BEGIN_ARG_INFO()或者ZEND_BEGIN_ARG_INFO_EX()宏开始的,以ZEND_END_ARG_INFO()宏结束,我们给ZEND_ARG_INFO()宏的第一个参数传递0表示非引用方式传递。


第五步、编译和测试:

执行./configure && make && make install 编译然后php.ini添加klpeng.so扩展,在php代码里测试:

$klpeng = new klpeng();
print_r($klpeng->something);
$klpeng->study('php是世界上最好的语言');
print_r($klpeng->something);

输出内容如下:

null
string 'php是世界上最好的语言' (length=30)

至此,一个PHP扩展写的类,就完成了

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢