在 PHP 中内联引用传递调用
In-lining a pass by reference call in PHP
我对 PHP 中的传递引用有疑问。我在网上搜索过,但没有看到任何关于这个问题的具体信息。以下函数从数组中删除键并 returns 它的值更新数组:
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
Array ( [0] => a [2] => c )
所以它很有魅力,现在我想把代码缩短一点:
echo array_fetch(1, $a = foo());
print_r($a);
Notice: Only variables should be passed by reference in ...
b
Array ( [0] => a [1] => b [2] => c )
我假设我给出一个变量作为参考是错误的吗?显然是这样,因为数组也没有改变,但我不明白为什么会发生这种情况。即使我用 ()
括起表达式也无济于事。
更新:
一个可行的解决方法是使用像这样的包装函数:
function &ref($var){
return $var;
}
echo array_fetch(1, $a = &ref(['a', 'b', 'c']));
print_r($a);
b
Array ( [0] => a [2] => c )
array_fetch(1, $a = foo());
是 不是
assign $a
and pass $a
to function.
它是
assign $a
and pass the result of assign to function.
并且assign
操作的结果是分配的值。
因此,array_fetch(1, $a = foo());
等同于 array_fetch(1, ['a', 'b', 'c'])
,其中第二个参数不是变量。
所以,唯一的解决办法还是:
$a = foo();
echo array_fetch(1, $a);
我对 PHP 中的传递引用有疑问。我在网上搜索过,但没有看到任何关于这个问题的具体信息。以下函数从数组中删除键并 returns 它的值更新数组:
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
Array ( [0] => a [2] => c )
所以它很有魅力,现在我想把代码缩短一点:
echo array_fetch(1, $a = foo());
print_r($a);
Notice: Only variables should be passed by reference in ...
b
Array ( [0] => a [1] => b [2] => c )
我假设我给出一个变量作为参考是错误的吗?显然是这样,因为数组也没有改变,但我不明白为什么会发生这种情况。即使我用 ()
括起表达式也无济于事。
更新:
一个可行的解决方法是使用像这样的包装函数:
function &ref($var){
return $var;
}
echo array_fetch(1, $a = &ref(['a', 'b', 'c']));
print_r($a);
b
Array ( [0] => a [2] => c )
array_fetch(1, $a = foo());
是 不是
assign
$a
and pass$a
to function.
它是
assign
$a
and pass the result of assign to function.
并且assign
操作的结果是分配的值。
因此,array_fetch(1, $a = foo());
等同于 array_fetch(1, ['a', 'b', 'c'])
,其中第二个参数不是变量。
所以,唯一的解决办法还是:
$a = foo();
echo array_fetch(1, $a);