【问题标题】:Is there any problem if you do sort(&$myArray)?如果你做 sort(&$myArray) 有什么问题吗?
【发布时间】:2011-11-08 16:08:14
【问题描述】:

PHP 手册说你必须做sort($array)$array 将通过引用传递,因此sort() 将修改$myArray

我只是想知道如果您这样做sort(&$myArray) 是否有任何问题或暗示。

【问题讨论】:

  • 它会触发E_DEPRECATED 通知。 (即使阻止对期望它的函数进行引用传递也有点毫无意义。)
  • 现在可能不会。不推荐在调用时间通过引用传递。
  • 已弃用:调用时传递引用已弃用
  • 你们应该发布答案而不是 cmets!

标签: php pass-by-reference


【解决方案1】:

简短的回答是它不会产生影响。

长答案是您应该不惜一切代价避免引用。它们是错误的主要来源,您真的不需要它们。在极少数情况下需要参考来解决问题,但它们很少而且相差甚远。

之所以有很多引用,是因为在 PHP 5.0 之前,没有对象引用的概念。因此,您需要通过引用传递所有对象(并通过引用返回它们)以获得任何类型的 OO 功能(允许方法修改对象等)。但自从 5.0(已有十年历史)以来,就不再需要了。要了解它现在的工作原理,我建议阅读this answer

所以做更可维护和正确的用法:

sort($myArray);

【讨论】:

  • 感谢您的回答。我知道引用涉及什么。我正在为 Zend PHP 认证进行培训,我只是在寻找每一个细节。我知道我必须尽可能避免传递引用。调用 sort(&$myArray) 以任何方式修改 $myArray 与调用 sort($myArray) 修改的方式不同?
【解决方案2】:

给出更详细的答案:

  • 它可以在 PHP 5.2 及之前版本中正常工作。
  • 它会在 PHP 5.3 上触发 E_DEPRECATED 警告(有时)
  • 很可能停止在 PHP 5.4 上工作。 (在拒绝错误和内存违规错误之间交替出现。尚未最终确定,但该更改可能会保留。)

不推荐使用传递引用的原因是分散的。它主要是代码清洁度。其次,它通常被新手滥用,如果无人监督,会导致副作用。 (如果新人滥用曾经是弃用的充分理由,那么 mysql_query 应该早就不复存在了。)
第三,当 ZendVM 不期望通过引用传递参数时,实际上存在一些内部内存管理问题。 (Quercus 和 Project Zero 没有这样的问题。)

【讨论】:

  • 5.4 是否也将删除 foreach ($array as &$val) {} ?
  • @tandu:不,那没有受损。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2011-03-09
  • 1970-01-01
  • 2014-07-19
  • 2014-05-19
相关资源
最近更新 更多