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:为啥用括号括起来的函数调用会阻止“通过引用”通知? [复制]的主要内容,如果未能解决你的问题,请参考以下文章