2015-06-10 50 views
2

我尝试在扩展中创建一个新函数,该函数使用array作为参数向添加一个条目,即数组的同一个实例并再次返回该实例。返回与传递给函数相同的数组(zval)

所以这是迄今为止代码:

PHP_FUNCTION(make_array) 
{ 
     // array_init(return_value); // Also Tried to transform default NULL to array 

     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &return_value) == FAILURE) { 
       RETURN_FALSE; 
     } 

     add_assoc_long(return_value, "answer", 42); 

     return; 
} 

但我只得到NULL为返回值,或者如果我取消array_init(return_value);return_value是一个空数组。

那么,为什么这种行为?而我理解错了什么?

+0

的'array_init(RETURN_VALUE);'是绝对必需的;-) –

+0

@杰克同意这一点,但为什么我得到一个空数组作为返回值?即使将参数数组复制到'return_value'也不起作用...我将数值'42'添加到初始化数组中,但它保持空... – TiMESPLiNTER

+0

您是否尝试过在ZPP中使用常规'zval *',然后使用'RETVAL_ZVAL'? –

回答

1

直接使用return_value作为ZPP参数的一部分通常不会(实际上,从不);它通常通过引入定期zval *容器,然后RETURN_ZVAL或RETVAL_ZVAL宏做的是使用:

PHP_FUNCTION(make_array) 
{ 
    zval *arr; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arr) == FAILURE) { 
     return; 
    } 

    add_assoc_long(arr, "answer", 42); 
    RETURN_ZVAL(arr, 0, 0); 
} 
+0

我用'RETVAL_ZVAL'而不是像你'RETURN_ZVAL()'和结果是一样的。这两个宏之间有什么区别?我还设法修改了传入的数组,并通过将'cpy'参数设置为'0'而不是将'RETURN_ZVAL()'宏设置为'1'来保留此实例。 – TiMESPLiNTER

+1

@TiMESPLiNTER'RETVAL_ZVAL'只是设置返回值,它实际上并没有从函数中返回......如果它们是最后一条语句,它们也是一样的:) –

+0

是的,'copy'参数有点故意我想......我通常不喜欢那些函数返回一个引用来传递什么......并且在写入时复制,实际上应该没有太大的区别。 –