2015-06-10 83 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'參數有點故意我想......我通常不喜歡那些函數返回一個引用來傳遞什麼......並且在寫入時複製,實際上應該沒有太大的區別。 –