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

藏色散人
풀어 주다: 2023-04-06 10:12:02
앞으로
3513명이 탐색했습니다.

이 글에서는 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:yurunsoft.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿