如何在php扩展中实现parent :: __ construct()调用?

时间:2017-05-18 04:21:45

标签: php php-extension

我想在php扩展程序中实现以下代码

class A{
    public function __construct(){
    }
}

class B extends A{
    public function __construct(){
        parent::__construct();
    }
}

我写过这些:

 zend_class_entry *a_class_ce, *b_class_ce;

    ZEND_METHOD(a_class, __construct){
    }

    ZEND_METHOD(b_class, __construct){
    }

    static zend_function_entry a_class_method[]={
            ZEND_ME(a_class, __construct, NULL, ZEND_ACC_PUBLIC)
            {NULL, NULL, NULL}
    };

    static zend_function_entry b_class_method[]={
            ZEND_ME(b_class, __construct, NULL, ZEND_ACC_PUBLIC)
            {NULL, NULL, NULL}
    };

    ZEND_MINIT_FUNCTION(test){
        zend_class_entry a_ce, b_ce;

        INIT_CLASS_ENTRY(a_ce, "A", a_class_method);
        a_class_ce = zend_register_internal_class(&a_ce TSRMLS_CC);

        INIT_CLASS_ENTRY(b_ce, "B", b_class_method);
        b_class_ce = zend_register_internal_class_ex(&b_ce, b_class_ce TSRMLS_CC);

        return SUCCESS;
    }

但我不知道如何实现parent :: __ construct();

如何实现parent :: __ construct()?

1 个答案:

答案 0 :(得分:0)

我还没有机会对此进行测试,但似乎它的工作基于我在php-src的一些核心扩展中看到的用法:

void call_parent_constructor(zval* zobj)
{
    zend_class_entry* ce = zend_get_class_entry(zobj);
    zend_class_entry* parentEntry = ce->parent;

    if (parentEntry == NULL) {
        php_error(E_ERROR,"fail call_parent_constructor(): class has no parent");
        return;
    }

    zend_call_method(
        &zobj,
        parentEntry,
        &parentEntry->constructor,
        "__construct",
        sizeof("__construct")-1,
        NULL,
        0,
        NULL,
        NULL);
}

此示例假定您不需要将任何参数传递给父构造函数。如果您需要传递参数,请注意zend_call_method()仅限于传递0,1或2个参数。

更新我已经在PHP 5中测试了这种方法,它按预期工作。