PHP:为什么带括号的周围函数调用会阻止"通过引用传递"通知?

Sla*_*ack 8 php

我一直在寻找这个,但只发现了"这是一个有效的技巧"的行,但从来没有解释过.

在以下代码中:

error_reporting(-1);
ini_set("display_errors", 1);
end(array_flip($_GET));
end((array_flip($_GET)));
Run Code Online (Sandbox Code Playgroud)

第一次打电话end()通知结果:

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

下一个array_flip($_GET)附带的内容()不会引起任何投诉.

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

请注意,我不确定我是否喜欢这种结构,即使它是安全的(很容易看不到它,而其他人可能不知道为什么会这样),但是当功能可以很方便时,它通常很方便易读.像这样串起来.

小智 3

这涉及到实现细节,如StackOverflow 上其他地方所讨论的。

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