在PHP中对一个pass-by-reference调用进行换行


In-lining a pass by reference call in PHP

我有一个关于PHP中的传递引用的问题。我在网上搜索过,但找不到任何具体的问题。以下函数从数组中删除密钥,并返回更新数组的值:

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)

array_fetch(1, $a = foo());而不是

分配CCD_ 3并将CCD_。

分配CCD_ 5并将分配结果传递给函数。

assign运算的结果就是所分配的值。

所以,array_fetch(1, $a = foo());等价于array_fetch(1, ['a', 'b', 'c']),其中第二个自变量不是变量。

因此,唯一的解决方案仍然是:

$a = foo();
echo array_fetch(1, $a);