ホームページ >バックエンド開発 >PHPチュートリアル >PHP デストラクター メソッド __destruct() がトリガーされない場合の 2 つの解決策

PHP デストラクター メソッド __destruct() がトリガーされない場合の 2 つの解決策

藏色散人
藏色散人転載
2019-04-24 11:22:373534ブラウズ

この記事では、PHP のデストラクター メソッド __destruct() がトリガーされない問題に対する解決策を主に 2 つ紹介します。

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;

上記のコードでは、設定を解除する前に、Test クラスのプロキシを 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() がトリガーされない場合の 2 つの解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyurunsoft.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。