PHP:为啥用括号括起来的函数调用会阻止“通过引用”通知? [复制]

Posted

技术标签:

【中文标题】PHP:为啥用括号括起来的函数调用会阻止“通过引用”通知? [复制]【英文标题】:PHP: Why do surrounding function calls with parentheses prevent 'pass by reference' notices? [duplicate]PHP:为什么用括号括起来的函数调用会阻止“通过引用”通知? [复制] 【发布时间】:2015-03-26 13:19:37 【问题描述】:

我对此进行了四处搜索,但只找到了类似于“这是一个有效的技巧”但从未解释过的东西。

在以下代码中:

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 解析器?如果它确实创建了一个临时变量(并且设计如此),那么这应该是安全可以使用的,但如果它是一个hack欺骗解析器,那么它可能会在未来的 PHP 版本中中断。 (我碰巧在 PHP 版本 5.4.36-0+deb7u1)

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

【问题讨论】:

邓布利多在 S.O 好吧,我会的 大概是:Parentheses altering semantics of function call result @mario - 谢谢,我相信你是对的。我没见过那个。毕竟听起来它并不完全安全 无法保证这将继续与 PHP7 一起工作。尽管可以放宽 E_STRICT 通知,但并非不可行,就像 empty() on 表达式一样。 【参考方案1】:

正如elsewhere on *** 所讨论的那样,这适用于实现细节。

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

【讨论】:

谢谢,我相信你是对的。我没见过那个。听起来这根本不安全 链接到 RFC 让您获得一个向上的三角形点击。

以上是关于PHP:为啥用括号括起来的函数调用会阻止“通过引用”通知? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 返回(值); vs 返回值;

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?

如何解释用大括号括起来的函数值(菊石问题)

为啥将 C 代码块用花括号括起来?

为啥在打字稿中用方括号括起来的名称声明方法?

为啥将箭头函数体包装在括号中