PHP:为什么只能通过引用传递变量?

问题描述 投票:1回答:2

如果您是PHP开发人员,您很可能已经看到以下通知:

注意:只有变量应该通过xs行上的/somefile.php中的引用传递

(在qazxsw poi中广泛对待的问题)

投掷通知示例:

Only variables should be passed by reference

工作范例:

$string = "hi-dude";
echo end(explode('-', $string));

说明:

只有实数变量可以通过引用传递,而不是返回正确变量的函数。

但是我想不出这个通知发生的充分理由。这感觉很不必要,有时我需要编写很多额外的代码。 PHP有这种奇怪限制的原因是什么?为什么这个问题甚至存在?

php function pass-by-reference php-7
2个回答
2
投票

$string = "hi-dude"; $strings = explode('-', $string); echo end($strings); end()将返回array_pop()的消息

只应通过引用传递变量

原因是E_NOTICE需要引用,因为它使当前元素指针指向最后一个元素。

你可以用一条线做,

end()

但是:ぁzxswい


1
投票

最后,我找到了一个很好的解释,帮助我理解这一点:$string = "this-is-a-sample-text"; echo substr(strrchr($string, '-'), 1);

正如Daniel Pryden所说:

简单来说:

  • 按值调用意味着您将值作为函数参数传递
  • 通过引用调用意味着您将变量作为函数参数传递

用比喻来说:

  • 按价值呼叫是我在一张纸上写下东西然后交给你的地方。也许它是一个URL,也许它是战争与和平的完整副本。无论它是什么,它都放在我给你的一张纸上,所以现在它实际上是你的一张纸。你现在可以自由地在那张纸上涂鸦,或者用那张纸在其他地方找到一些东西,然后用它来捣乱。
  • 通过引用打电话的时候我给你的笔记本里面写了一些东西。你可以在我的笔记本上乱涂乱画(也许我想要你,也许我不会),然后我把笔记本放在你的笔记本里,随便放一些涂鸦。此外,如果您或我写的是有关如何在其他地方找到某些内容的信息,您或我可以去那里并提供相关信息。

在这种情况下,通知“只应通过引用传递变量”仍然是不合理的,因为我们只对检索数组的最后一个值感兴趣。然而,函数https://3v4l.org/jO29n被定义为

混合端(数组和$数组)

通过引用传递状态的&符号是出于某种原因:What's the difference between passing by reference vs. passing by value?不只是返回数组的最后一个元素,它还将其内部指针更改为结尾。因此,数组被修改。

如果我们只返回数组的最后一个元素而不触及数组,则不需要通过引用传递数组,我们就不会注意到这一点。但end()在某种程度上是错误的功能。

如果我没有理由得到这个通知怎么办?请注意,要调用的函数也可能定义错误。在我的情况下,我喜欢这样定义的函数:

end()

这只是一个错误的函数定义。因此,如果你也收到这样的通知:检查你调用的函数是否正确定义。通过引用传递在这里没有意义,因为传递的数组不会以任何方式触及。因此,函数定义应该没有“reference&/”:

end()

在某些情况下,如果您知道自己在做什么,可能会使用错误控制操作符。因此:

/**
 * Flatten an array by one level if only needing a certain key value from a sub array.
 *
 * Example: [["foo"=>"bar","foo"=>"cheese"]]
 * Result: ["bar","cheese"]
 *
 * @param $array: The input array.
 * @param $key: The key to flatupshift. Default is 0.
 * @return $array: The result
 */
private function array_flatupshift(&$array, $key = 0) {
    $a = [];
    foreach ($array as $item) {
        if (is_object($item)) {
            array_push($a, $item->$key);
        } else if (is_array($item)) {
            array_push($a, $item[$key]);
        }
    }
    return $a;
}

......将是o.k.我想爆炸的结果不再需要了。但是请注意抑制所有可能错误的缺​​点。如果我在这里出错,请纠正我。

© www.soinside.com 2019 - 2024. All rights reserved.