91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP析構方法 __destruct() 不觸發怎么辦

發布時間:2020-09-29 15:47:33 來源:億速云 閱讀:185 作者:小新 欄目:編程語言

這篇文章主要介紹了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析構方法 __destruct() 不觸發怎么辦內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德江县| 富蕴县| 襄樊市| 隆回县| 南康市| 长子县| 沙洋县| 海淀区| 桦南县| 富民县| 藁城市| 冷水江市| 溧水县| 仁化县| 行唐县| 汤原县| 北海市| 潜江市| 思南县| 丹棱县| 儋州市| 化州市| 泗水县| 肥东县| 太和县| 昔阳县| 顺义区| 平南县| 石楼县| 上思县| 呼和浩特市| 贡嘎县| 海宁市| 阳原县| 乐昌市| 绥中县| 沐川县| 古交市| 青阳县| 监利县| 洪雅县|