この記事では、PHP のデストラクター メソッド __destruct() がトリガーされない問題に対する解決策を主に 2 つ紹介します。
PHP でクラスが循環的に参照されると、__destruct() がトリガーされないという問題が発生することがあります。まず、問題のコードを見てみましょう:
<?php class Proxy { private $object; public function __construct($object) { $this->object = $object; } public function __destruct() { var_dump('__destruct:Proxy'); } } class Test { private $proxy; public function __construct() { $this->proxy = new Proxy($this); } public function __destruct() { var_dump('__destruct:Test'); } } $test = new Test; unset($test); echo 'no __destruct, wait 3s', PHP_EOL; sleep(3); echo '__destruct now:', PHP_EOL;
上に示すようにこのコードでは、unset($test) を実行すると、循環参照があるため __destruct() はトリガーされません。
以下の解決策 1 のコードを見てください:
<?php class Proxy { private $object; public function __construct($object) { $this->object = $object; } public function __destruct() { var_dump('__destruct:Proxy'); } } class Test { private $proxy; public function __construct() { $this->proxy = new Proxy($this); } public function __destruct() { var_dump('__destruct:Test'); } public function close() { $this->proxy = null; } } $test = new Test; $test->close(); echo '__destruct now:', PHP_EOL; unset($test); sleep(3); echo 'no operation', PHP_EOL;
上記のコードでは、設定を解除する前に、Test クラスのプロキシを null に設定し、再度設定を解除して __destruct () をトリガーします。
もちろん、手動で gc することもできます (解決策 2):
<?php class Proxy { private $object; public function __construct($object) { $this->object = $object; } public function __destruct() { var_dump('__destruct:Proxy'); } } class Test { private $proxy; public function __construct() { $this->proxy = new Proxy($this); } public function __destruct() { var_dump('__destruct:Test'); } } $test = new Test; unset($test); echo '__destruct now:', PHP_EOL; gc_collect_cycles(); sleep(3); echo 'no operation', PHP_EOL;
これが困っている友人の役に立てば幸いです。
以上がPHP デストラクター メソッド __destruct() がトリガーされない場合の 2 つの解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。