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


PHP ignoring returned reference from function considered harmful?

Derick Rethans有一篇旧文章说:

请注意,不接受来自 返回引用的函数。在某些情况下,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 手册指出:

与参数传递不同,这里[通过引用返回]你必须使用和 在这两个地方 - 指示您要通过引用返回,而不是 一个副本,并指示该引用绑定,而不是通常 作业,应该为$myValue做。

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

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

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

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

PHP

5.0 具有 Zend Engine 2,这是一个运行 PHP 的新虚拟机。 这是实现引用的地方。 5.1 在返回值的操作方面引入了一些向后不兼容的更改。 5.3 引入了真正的垃圾回收,并弃用了调用时按引用传递和按引用分配new。 史前文章没有涉及这些重要的变化。

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

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

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