我对PHP中的pass-by-reference有疑问。我在网上搜索过,但看不到这个问题的具体内容。以下函数从数组中删除键并返回更新数组的值:
function array_fetch($k, array &$a){
if(isset($a[$k]) || array_key_exists($k, $a)){
$v = $a[$k];
unset($a[$k]);
return $v;
}
return null;
}
我正在使用以下代码:
function foo(){
return ['a', 'b', 'c'];
}
$a = foo();
echo array_fetch(1, $a);
print_r($a);
b
数组([0] => a [2] => c)
所以它就像一个魅力,现在我想让代码更短一些:
echo array_fetch(1, $a = foo());
print_r($a);
注意:只有变量应该通过引用传递给...
b
数组([0] => a [1] => b [2] => c)
我认为我给变量作为参考是错误的吗?显然是这样,因为数组也没有改变,但我不明白为什么会发生这种情况。即使我用()
括起表达式,也无济于事。
更新
一个可行的解决方法是使用这样的包装函数:
function &ref($var){
return $var;
}
echo array_fetch(1, $a = &ref(['a', 'b', 'c']));
print_r($a);
b
数组([0] => a [2] => c)
答案 0 :(得分:10)
array_fetch(1, $a = foo());
不
指定
$a
并将$a
传递给函数。
是
分配
$a
并将赋值结果传递给函数。
assign
操作的结果是指定的值。
因此,array_fetch(1, $a = foo());
相当于array_fetch(1, ['a', 'b', 'c'])
,其中第二个参数不是变量。
所以,唯一的解决方案仍然是:
$a = foo();
echo array_fetch(1, $a);