function test($arr) {
return $arr;
}
$arr = [1111];
test($arr);
debug_zval_dump($arr);
test的c实现代码:
PHP_FUNCTION(test)
{
zval *arr;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_ARRAY(arr)
ZEND_PARSE_PARAMETERS_END();
Z_TRY_ADDREF_P(arr);
RETURN_ARR(Z_ARR_P(arr));
}
这段代码中$arr最终的引用计数是3,$arr定义的时候为1,调用test方法时内核通过宏Z_TRY_ADDREF_P加1,作为debug_zval_dump的参数时加1。问题是调用test方法时为什么要加1,而不是等到需要test的返回值的时候再加1?
$c = [33333];
$t = [
'a' => 111,
'c' => $c
];
$t['c'] = 222;
// test_set($t, 'c', 2111);
直接操作数组或调用test_set修改键"c"的值,变量$c的引用计数都减1了
test_set的c实现代码:
PHP_FUNCTION(test_set)
{
zval *arr, *val;
zend_string *key;
ZEND_PARSE_PARAMETERS_START(3, 3)
Z_PARAM_ARRAY_EX(arr, 0, 1)
Z_PARAM_STR(key)
Z_PARAM_ZVAL(val)
ZEND_PARSE_PARAMETERS_END();
Z_TRY_ADDREF_P(val);
zend_symtable_update(Z_ARRVAL_P(arr), key, val);
RETURN_TRUE;
}
在test_set中并没有对引用进行减1操作,请问这里的减1操作发生在那里?