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

时间:2013-08-13 08:20:53

标签: php memory-leaks reference php-internals

Derick Rethans an old article说:

  

请注意,不接受来自的参考是有害的   返回引用的函数。在某些情况下,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 Manual州:

  

与参数传递不同,这里[通过引用返回]你必须使用&   在这两个地方 - 表示你想通过引用返回,而不是   副本,并表示引用绑定,而不是通常的   分配,应该是$ myValue。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

PHP 5.0以Zend Engine 2为特色,这是一个运行PHP的新虚拟机。这是实现引用的地方。 5.1介绍some backwards-incompatible changes关于返回值的操纵。 5.3介绍real garbage collectiondeprecates both call-time pass-by-reference and assigning new by reference。史前文章没有解决这些重要的变化。

  

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

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

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