PHP忽略从被认为有害的函数返回的引用?

Posted

技术标签:

【中文标题】PHP忽略从被认为有害的函数返回的引用?【英文标题】:PHP ignoring returned reference from function considered harmful? 【发布时间】:2013-08-14 18:28:20 【问题描述】:

Derick Rethans 的 an old article 说:

请注意,不接受来自 返回引用的函数。在某些情况下,php 会得到 混淆并导致很难找到的内存损坏 调试。返回静态值也不是一个好主意 参考,因为 PHP 引擎也有问题。在 PHP 4.3 中, 这两种情况都可能导致很难重现 PHP 的错误和崩溃 和网络服务器。 在 PHP 5 中,这一切都好一点。这里 你可以期待一个警告,它会表现得“正常”。

这是否意味着在 PHP 5 中我们可以忽略从函数返回的引用?

我的意思是:

function &GetRef(&$array)
    $item =& $array[0];
    return $item;


$array = array(0, 1, 2);
$item =& GetRef($array); /* Normal usage of the function using assign by reference
                            also known as "accepting" the reference. */

$item = GetRef($array); /* Notice that here we didn't assign by reference.
                           Are we allowed to ignore the returned reference
                           and simply do normal assignment? */

PHP Manual 声明:

与参数传递不同,这里 [return by reference] 你必须使用 & 在这两个地方 - 表示您要通过引用返回,而不是 一份副本,并表明该参考绑定,而不是通常 分配,应该为 $myValue 完成。

它没有明确说我们必须接受返回的引用。

这是否意味着我们可以随意忽略返回的引用?

【问题讨论】:

也许你应该问问 Derick Ethans……他是唯一一个真正知道他所说的“好一点”是什么意思的人 鉴于 PHP 4.3 已经超过 10 年了,并且从那时起引擎已经完全重写,我认为您不需要对此做任何噩梦 @cHao 这不是一个简单的方法,并且由于该错误的不稳定,有可能在您的特定环境和您的尝试中不会出现。 但是,如果一个已知的错误在 PHP 中已经存在了 10 多年,并且通过对底层引擎的完全重写,那么它要么是现实中很少发生的事情,所以你不必担心关于它,或者 Ruby/Python/Java 团队会一直使用它作为弹药来证明这些语言的优越性,并且全世界都会意识到这一点。我?如果我遇到它,我会担心它,我会在适当的时候通过参考值接受我的回报,但否则我不会为此失眠 @AlmaDoMundo:BS。 PHP 不只是随意折腾值并希望获得最好的结果。行为是确定性的,完全基于 PHP 本身和程序的行为。 【参考方案1】:

正如 cmets 中所讨论的,如果不是全部内容,您通常应该至少忽略链接文章中的那个部分

这篇文章讨论了 PHP 4.3 上下文中的引用,该版本发布于 2002 年 12 月,并于 2007 年底停产。PHP 4 今天不应该使用。作为一般规则,在学习使用 PHP 时,您应该相信任何针对 PHP 版本早于 5.2(截至 2013 年中)的文章。

PHP 5.0 具有 Zend Engine 2,这是一个运行 PHP 的新虚拟机。这是实现引用的地方。 5.1 引入了some backwards-incompatible changes 关于返回值的操作。 5.3 引入了real garbage collection 和deprecates both call-time pass-by-reference and assigning new by reference。那篇史前文章没有提到这些重要的变化。

这是否意味着在 PHP 5 中我们可以忽略从函数返回的引用?

是的。现代 PHP 版本在丢弃 any 函数的返回值方面没有问题,无论是否引用。如果您遇到似乎与此预期相矛盾的行为,请创建一个简化的测试用例并向 PHP 维护人员提交错误。

另外,在您的代码中使用引用之前,请三思。传递引用不会节省时间,不会节省内存,也不会提高性能,除非在极少数情况下。谨慎使用它们以控制复杂性。

【讨论】:

那篇文章很好,因为它深入。遗憾的是 PHP 4。至于 PHP 5,您是否推荐任何深入参考的材料? PHP手册里的东西根本不够用。

以上是关于PHP忽略从被认为有害的函数返回的引用?的主要内容,如果未能解决你的问题,请参考以下文章

PHP开发最容易犯的错误

PHP中静态变量和函数引用返回

php函数名前添加& 函数的引用返回

是否可以从 PHP 中的闭包返回引用?

PHP递归函数返回值

c语言中的RETURN()返回值是啥意思?