Heim  >  Artikel  >  Backend-Entwicklung  >  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

藏色散人
藏色散人nach vorne
2019-04-24 11:22:373511Durchsuche

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;

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;

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;

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yurunsoft.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen