PHP 扩展中引用传参

c代码:

PHPAPI zval *php_array_set(zval *arr, char *p1, size_t len, const zval *val)
{
    zval *tmpVal;

    tmpVal = zend_hash_str_find(Z_ARRVAL_P(arr), p1, len);
    if (tmpVal != NULL) {
        ZVAL_DEREF(tmpVal);
        ZVAL_COPY(tmpVal, val);
    }

    return arr;
}

PHP_FUNCTION(array_set) /* {{{ */
{
    zval *arr, *val;
    char *key;
    size_t len;

    ZEND_PARSE_PARAMETERS_START(3, 3)
        Z_PARAM_ARRAY_EX(arr, 0, 1);
        Z_PARAM_STRING(key, len);
        Z_PARAM_ZVAL(val);
    ZEND_PARSE_PARAMETERS_END();

    php_array_set(arr, key, len, val);
    
    ZVAL_COPY(return_value, arr);
}

php代码:

$arr1 = [
    'a' => 1111
];

$arr2 = array_set($arr1, 'a', 2222);
var_dump($arr1, $arr2);

array_set接收一个引用参数,修改键值对应的值。
使用gdb调试时,在调用完php_array_set方法后打印arr参数,成功修改了
https://img2.mukewang.com/5c8f3dcf0001ec9f08000082.jpg

但是结果$arr2修改成功,但是$arr1还是原来的值。请问这是什么原因?

互换的青春
浏览 416回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP