【问题标题】: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 好吧,我会的
  • @mario - 谢谢,我相信你是对的。我没见过那个。毕竟听起来它并不完全安全
  • 无法保证这将继续与 PHP7 一起工作。尽管可以放宽 E_STRICT 通知,但并非不可行,就像 empty() on 表达式一样。

标签: php


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我相信你是对的。我没见过那个。听起来这根本不安全
  • 链接到 RFC 让您获得一个向上的三角形点击。
猜你喜欢
  • 2011-08-14
  • 2012-02-21
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多