4

ArrayObject で __destroy() メソッドを探していましたが、実装が見つかりませんでした。ArrayObject を含む変数を NULL に設定すると、格納されているすべてのオブジェクトが正しく破棄され、メモリが解放されますか? または、ArrayObject を反復処理して、オブジェクトの設定を解除する前に各オブジェクトを破棄する必要がありますか?

4

2 に答える 2

2

PHP では、自分の範囲を超えたメモリ使用量について心配する必要はまったくありません。unset($obj)あなたの場合、うまくいきます。または、現在の関数をそのままにしておくこともできます。

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

    // do something
}

そして、データは問題なくクリーンアップされます。

PHP の内部メモリ管理はかなり単純です。参照カウントはデータごとに保持され、それが 0 の場合は解放されます。ArrayObject だけがオブジェクトを保持している場合、refcount は 1 です。ArrayObject がなくなると、refcount は 0 になり、オブジェクトはなくなります。

于 2011-11-26T15:40:49.900 に答える
2

ArrayObject を unset または null にすると、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も参照してください。

于 2011-11-26T15:42:31.073 に答える