Cet article présente principalement deux solutions au problème selon lequel la méthode du destructeur PHP __destruct() n'est pas déclenchée.
Parfois, lorsqu'une classe est référencée de manière cyclique en PHP, cela provoque le problème que __destruct() n'est pas déclenchée. Examinons d'abord le code du problème :
<?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;
Comme le code ci-dessus, run unset($test) , __destruct() ne sera pas déclenché car il existe une référence circulaire.
Regardez le code de la solution 1 ci-dessous :
<?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;
Le code ci-dessus, avant de le désactiver, définissez le proxy dans la classe Test sur null, puis désactivez-le à nouveau, il peut être déclenché __destruct().
Bien sûr, vous pouvez également gc manuellement (solution 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;
J'espère que cela sera utile aux amis dans le besoin !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!