如何将数组作为对象属性添加到在PHP扩展中声明的类中?

4
我希望我的PHP扩展能够声明一个与以下PHP等效的类:
class MyClass
{
    public $MyMemberArray;

    __construct()
    {
        $this->MyMemberArray = array();
    }
}

我正在跟随 "高级PHP编程" 和 "扩展和嵌入PHP" 中的示例,我能够在 PHP_MINIT_FUNCTION 中声明一个具有整数属性的类。

然而,当我使用相同的方法在 PHP_MINIT_FUNCTION 中声明一个数组属性时,在运行时会出现以下错误消息:

PHP Fatal error:  Internal zval's can't be arrays, objects or resources in Unknown on line 0

在《高级PHP编程》第557页上有一个例子,说明如何声明一个构造函数来创建数组属性,但是示例代码无法编译(第二个“object”似乎是多余的)。
我修复了这个错误,并将其适应于我的代码:
PHP_METHOD(MyClass, __construct)
{
    zval *myarray;
    zval *pThis;

    pThis = getThis();

    MAKE_STD_ZVAL(myarray);

    array_init(myarray);
    zend_declare_property(Z_OBJCE_P(pThis), "MyMemberArray", sizeof("MyMemberArray"), myarray, ZEND_ACC_PUBLIC TSRMLS_DC);
}

这段代码可以编译通过,但在构建时会出现相同的运行时错误。
1个回答

6
答案是在构造函数中使用add_property_zval_ex(),而不是zend_declare_property()
以下是预期的工作方式:
PHP_METHOD(MyClass, __construct)
{
    zval *myarray;
    zval *pThis;

    pThis = getThis();

    MAKE_STD_ZVAL(myarray);

    array_init(myarray);
    add_property_zval_ex(pThis, "MyMemberArray", sizeof("MyMemberArray"), myarray);
}

但是你知道为什么这是答案吗?有什么推理依据吗? - Christopher Thomas
这个推理与zval的创建方式有关。相信我,这是一个冗长的解释。 - markzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接