Heim > Artikel > Backend-Entwicklung > Zwei Lösungen dafür, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird
In diesem Artikel werden hauptsächlich zwei Lösungen für das Problem vorgestellt, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird.
Wenn in PHP zyklisch auf eine Klasse verwiesen wird, kommt es manchmal zu dem Problem, dass __destruct() nicht ausgelöst wird:
<?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;
Der obige Code, wenn er ausgeführt wird unset($test), __destruct() wird nicht ausgelöst, da ein Zirkelverweis vorliegt.
Sehen Sie sich den Code für Lösung 1 unten an:
<?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;
Setzen Sie im obigen Code vor dem Deaktivieren den Proxy in der Testklasse auf Null und deaktivieren Sie ihn dann erneut, um __destruct() auszulösen.
Natürlich können Sie auch manuell gc (Lösung 2) verwenden:
<?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;
Ich hoffe, es hilft Freunden in Not!
Das obige ist der detaillierte Inhalt vonZwei Lösungen dafür, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!