__destruct
外部オブジェクトがスコープから外れるとすぐに循環参照がクリーンアップされるように、クラスのを設定する方法を思い出しているようです。しかし、私が作成した簡単なテストは、これが私が期待/期待したように動作していないことを示しているようです。
最も外側のオブジェクトがスコープから外れたときにPHPがクラスを正しくクリーンアップするようにクラスを設定する方法はありますか?
私はこのコードを書くための別の方法を探していません、私はこれができるかどうかを探しています、もしそうなら、どのように?私は通常、可能な限りこれらのタイプの循環参照を避けようとします。
class Bar {
private $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __destruct() {
print "[destroying bar]\n";
unset($this->foo);
}
}
class Foo {
private $bar;
public function __construct() {
$this->bar = new Bar($this);
}
public function __destruct() {
print "[destroying foo]\n";
unset($this->bar);
}
}
function testGarbageCollection() {
$foo = new Foo();
}
for ( $i = 0; $i < 25; $i++ ) {
echo memory_get_usage() . "\n";
testGarbageCollection();
}
出力は次のようになります。
60440
61504
62036
62564
63092
63620
[ destroying foo ]
[ destroying bar ]
[ destroying foo ]
[ destroying bar ]
[ destroying foo ]
[ destroying bar ]
[ destroying foo ]
[ destroying bar ]
[ destroying foo ]
[ destroying bar ]
私が望んでいたこと:
60440
[ destorying foo ]
[ destorying bar ]
60440
[ destorying foo ]
[ destorying bar ]
60440
[ destorying foo ]
[ destorying bar ]
60440
[ destorying foo ]
[ destorying bar ]
60440
[ destorying foo ]
[ destorying bar ]
60440
[ destorying foo ]
[ destorying bar ]
アップデート:
PHP> 5.3に関連するこの質問に対するいくつかの優れた回答がありますが、実際には私のプロジェクト(PHP 5.2.x)に関連しているため、PHP<5.3で機能する回答を選択しました。