2011-11-26 60 views
4

我正在查找ArrayObject中的__destroy()方法,但未找到任何实现。 如果我将包含一个ArrayObject的变量设置为NULL,它是否会正确销毁存储在其中的所有对象并释放内存?或者我应该迭代ArrayObject来销毁每个对象,然后再设置它?在PHP中销毁ArrayObject

回答

2

当您取消设置或清空ArrayObject时,只有ArrayObject实例被销毁。如果ArrayObject包含其他对象,那么只有在其他地方没有引用它们的情况下,才会销毁这些对象。

$foo = new StdClass; 
$ao = new ArrayObject; 
$ao[] = $foo; 
$ao[] = new StdClass; 
$ao = null;  // will destroy the ArrayObject and the second stdClass 
var_dump($foo); // but not the stdClass assigned to $foo 

另见http://www.php.net/manual/en/features.gc.refcounting-basics.php

2

在PHP中,你不必担心内存使用超出你自己的范围。 unset($obj)将工作正常,在你的情况。或者,你可以简单地离开你所在的功能:

function f() { 
    $obj = new ArrayObject(); 

    // do something 
} 

而且数据将被清理得很好。

PHP的内部内存管理相当简单:为每个数据片段保留一个引用计数,如果这是0,则会被释放。如果只有ArrayObject持有该对象,则它的refcount为1.一旦ArrayObject消失,refcount为0,对象将消失。

+0

的ArrayObjects存储在不同的对象的属性,其中一些得到真正的大(包含包含ArrayObjects等对象ArrayObjects)。数据结构在相同的范围内变得非常消耗内存。 – Gerardo

+0

在这种情况下,使用'unset()'(我相当确定它立即触发GC)或将该变量设置为NULL。它会清理所有的东西。 –