>  기사  >  백엔드 개발  >  PHP 소멸자 메서드 __destruct()가 트리거되지 않는 두 가지 솔루션

PHP 소멸자 메서드 __destruct()가 트리거되지 않는 두 가지 솔루션

藏色散人
藏色散人앞으로
2019-04-24 11:22:373435검색

이 글에서는 주로 PHP 소멸자 메서드 __destruct()가 트리거되지 않는 문제에 대한 두 가지 해결 방법을 소개합니다.

때때로 PHP에서 클래스가 주기적으로 참조되면 __destruct()가 트리거되지 않는 문제가 발생할 수 있습니다. 문제 코드부터 시작해 보겠습니다.

<?php
class Proxy
{
    private $object;
 
    public function __construct($object)
    {
        $this->object = $object;
    }
 
    public function __destruct()
    {
        var_dump(&#39;__destruct:Proxy&#39;);
    }
}
 
class Test
{
    private $proxy;
 
    public function __construct()
    {
        $this->proxy = new Proxy($this);
    }
 
    public function __destruct()
    {
        var_dump(&#39;__destruct:Test&#39;);
    }
}
 
$test = new Test;
unset($test);
 
echo &#39;no __destruct, wait 3s&#39;, PHP_EOL;
 
sleep(3);
 
echo &#39;__destruct now:&#39;, PHP_EOL;

위 코드에서 볼 수 있듯이 unset($test)를 실행할 때, __destruct()는 순환 참조로 인해 트리거되지 않습니다.

아래 솔루션 1의 코드를 살펴보세요.

<?php
class Proxy
{
    private $object;
 
    public function __construct($object)
    {
        $this->object = $object;
    }
 
    public function __destruct()
    {
        var_dump(&#39;__destruct:Proxy&#39;);
    }
}
 
class Test
{
    private $proxy;
 
    public function __construct()
    {
        $this->proxy = new Proxy($this);
    }
 
    public function __destruct()
    {
        var_dump(&#39;__destruct:Test&#39;);
    }
 
    public function close()
    {
        $this->proxy = null;
    }
}
 
$test = new Test;
$test->close();
 
echo &#39;__destruct now:&#39;, PHP_EOL;
 
unset($test);
 
sleep(3);
 
echo &#39;no operation&#39;, PHP_EOL;

위 코드에서 설정을 해제하기 전에 테스트 클래스의 프록시를 null로 설정한 다음 다시 설정 해제하여 __destruct()를 트리거합니다.

물론 수동으로 gc(솔루션 2)를 수행할 수도 있습니다.

<?php
class Proxy
{
    private $object;
 
    public function __construct($object)
    {
        $this->object = $object;
    }
 
    public function __destruct()
    {
        var_dump(&#39;__destruct:Proxy&#39;);
    }
}
 
class Test
{
    private $proxy;
 
    public function __construct()
    {
        $this->proxy = new Proxy($this);
    }
 
    public function __destruct()
    {
        var_dump(&#39;__destruct:Test&#39;);
    }
}
 
$test = new Test;
unset($test);
 
echo &#39;__destruct now:&#39;, PHP_EOL;
gc_collect_cycles();
 
sleep(3);
 
echo &#39;no operation&#39;, PHP_EOL;

도움이 필요한 친구들에게 도움이 되기를 바랍니다!

위 내용은 PHP 소멸자 메서드 __destruct()가 트리거되지 않는 두 가지 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yurunsoft.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제