PHP:为什么用括号括起来的函数调用会阻止“按引用传递”通知


PHP: Why do surrounding function calls with parentheses prevent 'pass by reference' notices?

我已经搜索了一下,但只找到了"这是一个有效的技巧"之类的东西,但从来没有解释过。

在下面的代码中:

error_reporting(-1);
ini_set("display_errors", 1);
end(array_flip($_GET));
end((array_flip($_GET)));

第一次调用end()会导致通知:

严格的标准:只有变量应该在第 3 行的/home/john/www/test/dp.php 中通过引用传递

下一个,array_flip($_GET)()封闭,不会产生任何投诉。

我理解通知的原因,严格标准是什么,"通过引用传递"是什么意思,以及end()接受对数组的引用作为其参数。(它必须,因为它会影响原始版本。我关心的是它为什么有效。周围的()是否创建了一个临时变量,或者这只是以某种方式欺骗了 PHP 解析器?如果它确实创建了一个临时变量(并且是设计这样做的),那么这应该是安全的,但如果这是一个欺骗解析器的黑客,那么它可能会在未来版本的 PHP 中中断。(我碰巧在PHP版本5.4.36-0 + deb7u1)

请注意,我

不确定我是否喜欢这种结构,即使它是安全的(很容易看不到它,其他人可能不知道它为什么在那里),但是当函数可以像这样串在一起时,它通常很方便且易于阅读。

这适用于实现细节,如StackOverflow其他地方所讨论的那样。

总结:这种行为实际上应该被视为一个错误。不要依赖它。事实上,多亏了这个 RFC,一旦 PHP 7 发布,这个技巧将不再有效。