我想在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()?
答案 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中测试了这种方法,它按预期工作。