2012-04-07 11 views
0

Ich bin noch neu zu schreiben Erweiterungen. Ich versuche dies das Ergebnis sein zu bekommen:Wie erstellt man eine private Eigenschaft als Array in einer Klasse innerhalb von PHP ext

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

Ich erhalte eine Fehlermeldung, wenn Instanziieren FooClass:

PHP Fatal error: Kann nicht das Privateigentum ArrayClass Zugriff :: $ Elemente

Ich weiß genau, warum das passiert. Ich kenne einfach nicht die richtige Art, eine Klassendefinition als Array zu erstellen. Das ist, was ich habe, so weit, ich bin sicher, dass es trivial ist:

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); 
} 

create_class_def die von PHP_MINIT_FUNCTION genannt get(). Es gibt eine ähnliche Frage hier: How do I add an array as an Object Property to a class declared within a PHP extension? aber es adressiert nicht privaten/geschützten Zugang.

thx

Antwort

0

Der einfachste Weg wäre wahrscheinlich zend_update_property zu verwenden:

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

name_length den Terminator ist auszuschließen.

Verwandte Themen