【问题标题】:In-lining a pass by reference call in PHP在 PHP 中内联传递引用调用
【发布时间】:2016-04-16 14:30:21
【问题描述】:

我有一个关于 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 )

【问题讨论】:

  • 解决此问题的方法是先进行赋值,然后在函数调用中使用变量。 $a = foo(); echo array_fetch(1, $a);

标签: php pass-by-reference php-7


【解决方案1】:

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);

【讨论】:

  • “希望投反对票的人会写下他自己的答案。” - 如此真实,我之前因完美/有效的答案/解决方案而被投反对票,他们最终发布了完全废话或根本没有发布。他们应该把钱放在嘴边;-) 干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2011-05-29
相关资源
最近更新 更多