2012-04-07 10 views
0

私はまだ拡張機能を書いています。私は、これは結果であることを取得しようとしている:私はどのようにプライベートプロパティをクラス内の配列としてPHP ext内に作成しますか

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

FooClassをインスタンス化する際に、私はエラーを取得しています:

PHPの致命的なエラー:私有財産ArrayClassにアクセスすることはできません:: $要素

なぜそれが起こっているのか正確に知っています。私はクラス定義を配列として作成する正しい方法を知らないだけです。これは私がこれまでのところ、私はそれは些細だと確信していたものです:

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)。同様の質問があります:How do I add an array as an Object Property to a class declared within a PHP extension?ですが、プライベート/保護されたアクセスは扱いません。

THX

答えて

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はターミネータを除いています。

関連する問題