3

Derick Rethans 有一篇旧文章说:

请注意,不接受来自返回引用的函数的引用是有害的。在某些情况下,PHP 会感到困惑并导致很难找到和调试的内存损坏。返回静态值作为引用也不是一个好主意,因为 PHP 引擎也有问题。在 PHP 4.3 中,这两种情况都可能导致很难重现 PHP 和 Web 服务器的错误和崩溃。在 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手册指出:

与参数传递不同,这里 [return by reference] 您必须在两个地方都使用 & - 表示您希望通过引用而不是副本返回,并指示应该为 $ 完成引用绑定而不是通常的赋值我的价值。

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

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

4

1 回答 1

2

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

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

PHP 5.0 具有 Zend Engine 2,这是一个运行 PHP 的新虚拟机。这是实现引用的地方。5.1在返回值的操作方面引入了一些向后不兼容的更改。5.3 引入了真正的垃圾收集,并弃用了调用时的 pass-by-reference 和 assigning newby reference。那篇史前文章没有解决这些重要的变化。

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

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

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

于 2013-08-13T23:09:02.807 回答