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

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

藏色散人
リリース: 2023-04-06 10:12:02
転載
3535 人が閲覧しました

この記事では、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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:yurunsoft.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート