0

私はまだエクステンションを書くのが初めてです。私はこれを結果にしようとしています:

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

create_class_def get は PHP_MINIT_FUNCTION() から呼び出されます。ここにも同様の質問があります: PHP 拡張機能内で宣言されたクラスに配列をオブジェクト プロパティとして追加するにはどうすればよいですか? ただし、プライベート/保護されたアクセスには対応していません。

どうも

4

1 に答える 1

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

于 2012-04-07T18:17:38.557 に答える