Heim > Backend-Entwicklung > PHP-Tutorial > Zwei Lösungen dafür, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird

Zwei Lösungen dafür, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird

藏色散人
Freigeben: 2023-04-06 10:12:02
nach vorne
3537 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich zwei Lösungen für das Problem vorgestellt, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird.

Wenn in PHP zyklisch auf eine Klasse verwiesen wird, kommt es manchmal zu dem Problem, dass __destruct() nicht ausgelöst wird:

<?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;
Nach dem Login kopieren

Der obige Code, wenn er ausgeführt wird unset($test), __destruct() wird nicht ausgelöst, da ein Zirkelverweis vorliegt.

Sehen Sie sich den Code für Lösung 1 unten an:

<?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;
Nach dem Login kopieren

Setzen Sie im obigen Code vor dem Deaktivieren den Proxy in der Testklasse auf Null und deaktivieren Sie ihn dann erneut, um __destruct() auszulösen.

Natürlich können Sie auch manuell gc (Lösung 2) verwenden:

<?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;
Nach dem Login kopieren

Ich hoffe, es hilft Freunden in Not!

Das obige ist der detaillierte Inhalt vonZwei Lösungen dafür, dass die PHP-Destruktormethode __destruct() nicht ausgelöst wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:yurunsoft.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage