• 技术文章 >后端开发 >php教程

    PHP析构方法 __destruct() 不触发的两个解决办法

    藏色散人藏色散人2019-04-24 11:22:37转载2114
    本篇文章主要给大家介绍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;

    上面的代码,在unset之前,将Test类中的proxy设为null,然后再unset,就可以触发__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入门到就业线上直播课:查看学习

    以上就是PHP析构方法 __destruct() 不触发的两个解决办法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:yurunsoft,如有侵犯,请联系admin@php.cn删除

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:PHP __destruct()
    上一篇:【PHP】堆排序的原理以及实现代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• PHP 魔术方法:__construct __destruct• php中的构造函数__CONSTRUCT()和析构函数__DESTRUCT()使用• php中析构函数__destruct与垃圾回收机制解析• php:析构方法 __destruct在什么情况下执行?
    1/1

    PHP中文网