如何在php ext中的类中创建一个私有属性作为数组

时间:2012-04-07 07:42:53

标签: c php-extension

我还是新编写扩展程序。我试图让这成为结果:

class FooClass {
    private $elements = array();
}

我在实例化FooClass时遇到错误:

PHP致命错误:无法访问私有属性ArrayClass :: $ elements

我确切地知道为什么会发生这种情况我只是不知道将类定义创建为数组的正确方法。这就是我到目前为止所做的,我确信这是微不足道的:

static zend_class_entry *foo_class_ptr;

void create_class_properties(TSRMLS_D) {
     zend_declare_property_null(foo_class_ptr, "elements", strlen("elements"), ZEND_ACC_PRIVATE);
}

ZEND_METHOD(foo_class, __construct) { 
    zval *this = getThis();
    zval *elements;

    MAKE_STD_ZVAL(elements);
    array_init(elements);

    add_property_zval_ex(this, "elements", sizeof("elements"), elements);
}

static zend_function_entry foo_class_methods_def[] = { 
    PHP_ME(foo_class, __construct, NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};

void create_class_def(TSRMLS_D) {
    zend_class_entry ce;
    INIT_CLASS_ENTRY(ce, "FooClass", foo_class_methods_def);

    foo_class_ptr = zend_register_internal_class(&ce);
}

从PHP_MINIT_FUNCTION()调用create_class_def get。这里有一个类似的问题:How do I add an array as an Object Property to a class declared within a PHP extension?但它不涉及私人/受保护的访问。

THX

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是使用zend_update_property

void zend_update_property(zend_class_entry *scope, zval *object, const char *name, int name_length, zval *value TSRMLS_DC);

name_length不包括终止符。