이 글에서는 주로 PHP 소멸자 메서드 __destruct()가 트리거되지 않는 문제에 대한 두 가지 해결 방법을 소개합니다.
때때로 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;
위 코드에서 설정을 해제하기 전에 테스트 클래스의 프록시를 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()가 트리거되지 않는 두 가지 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!