Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt PHP den Destruktor eines Objekts aus, das zuerst instanziiert wird?

Warum führt PHP den Destruktor eines Objekts aus, das zuerst instanziiert wird?

黄舟
黄舟Original
2017-07-02 10:44:571653Durchsuche

Frage 1: Die Frage ist wie erwähnt, ich habe den Test selbst durchgeführt

class Obj{        
public $i;        
        public function construct($t){            
        $this->i = $t;            
        echo "执行构造函数$this->i";            
        echo "<br>";
        }        
        public function destruct(){            
        echo "执行析构函数$this->i";            
        echo "<br>";
        }
    }
    $obj1 = new Obj(1);
    $obj2 = new Obj(2);

执行构造函数1执行构造函数2执行析构函数2执行析构函数1

Frage 2: Ruft die Konstruktormethode der übergeordneten Klasse in der Unterklasse auf, nur um die übergeordnete Klasse zu initialisieren Klasse? Objekte der übergeordneten Klasse generieren?

=======================================UPDATE=== == ================================

Finden Sie eine verständlichere Aussage:

Ob der Heap oder der Stack zum Speichern von Daten verwendet wird, wird von der PHP-Engine bestimmt, und PHP-Entwickler müssen sich nicht darum kümmern.
Umleitung:
In der Implementierung der Zend Engine in PHP5 sind alle Werte ​​​​​werden Speicherplatz auf dem Heap zugewiesen und durch Referenzzählung und Garbage Collection verwaltet.
Die Zend Engine von PHP5 verwendet hauptsächlich Zeiger auf zval-Strukturen, um Werte zu verarbeiten, und operiert an vielen Stellen sogar über sekundäre Zeiger von zval.
Und in der Zend-In-the-Engine-Implementierung von PHP7 wird der Wert über die zval-Struktur selbst manipuliert (nicht über einen Zeiger). Die neue zval-Struktur wird direkt auf dem Stapel der VM im Bucket der HashTable gespeichert Der Attributslot.
Dadurch wird die Anzahl der Vorgänge zum Zuweisen und Freigeben von Speicher auf dem Heap erheblich reduziert.

========== ============ ================UPDATE1==================== =========== ======

Suchen Sie die spezifische Beschreibung

$p1 = new Person(); Für diesen Code ist $p1 die Objektname im Stapelspeicher new Person() Das reale Objekt befindet sich im Heapspeicher. Einzelheiten finden Sie in der folgenden Abbildung:

Warum führt PHP den Destruktor eines Objekts aus, das zuerst instanziiert wird?

Dies erklärt, warum das Objekt zuerst instanziiert wird später veröffentlicht

new Person(); gibt tatsächlich eine Referenz auf ein Objekt zurück, und dann wird die Referenz $p1 zugewiesen, einer im Stapel gespeicherten Variablen und einem Zeiger, der auf die von der zugewiesene Entität zeigt Objekt im Heap

Dies erklärt auch, dass die zugrunde liegenden Speichervariablen von PHP über eine Hash-Symboltabelle verfügen, um den

Lebenszyklus der Variable aufrechtzuerhalten. Die Symboltabelle enthält Schlüssel=>Wertpaare, und der Schlüssel ist Variablenname. Der Schlüssel zeigt auf die ZVAL-Struktur, also die erste Adresse des Werts.

Die Ausführung des Konstruktors und Destruktors verwendet tatsächlich eine Stapelstruktur, da Obj (2) später erstellt wird Obj (2) befindet sich oben auf dem Stapel und wird in der Reihenfolge „Wer zuerst rein, zuletzt raus“ auf dem Stapel zerstört.

Nachdem ich die Frage des Posters gelesen hatte, wollte ich auch wissen, warum nicht

执行构造函数1
执行构造函数1
执行析构函数2
执行析构函数2
PHP 5 hat das Konzept des Destruktors eingeführt, das anderen ähnlich ist

objektorientierte Sprachen wie C++. Der Destruktor wird ausgeführt, wenn alle Verweise auf ein Objekt gelöscht werden oder wenn das Objekt explizit zerstört wird

Das heißt, der Prozess ist so

Obj(1) 启动,申请自己的内存空间与上下文环境
Obj(2) 启动,申请自己的内存空间与上下文环境
Obj(2) 销毁,垃圾回收
Obj(1) 销毁,垃圾回收
Das ist Obj ( 1) Das Gleiche wie „First In, Last Out“, es wird später instanziiert, also wird es als Objekt der ersten Klasse zerstört?

Gleiches Handbuch. Vererbung ist eine bekannte Programmierfunktion, und auch das Objektmodell von PHP verwendet Vererbung. Die Vererbung wirkt sich auf die Beziehung zwischen Klassen und Objekten aus.
----------------------------
Obj(1) Obj(2) Obj(2) Obj(1)
----------------------------

Wenn Sie beispielsweise eine Klasse erweitern, erbt die Unterklasse alle öffentlichen und geschützten Methoden der übergeordneten Klasse. Sofern die Unterklasse die Methode der übergeordneten Klasse nicht überschreibt, behält die geerbte Methode ihre ursprüngliche Funktionalität.

Unterklassen können übergeordnete Klassenmethoden aufrufen und die Vererbungsbeziehung besteht nicht

Meine Gedanken:

Frage 1: Variablen, die Objektreferenzen enthalten, werden auf dem Stapel gespeichert. Der Stapel ist zuerst rein, zuletzt raus und die Variable obj2 wird zuerst mit obj1 zerstört

Frage 2: Es wird nur ein Unterklassenobjekt generiert

Die erste Frage: obj1 und obj2 werden offensichtlich gespeichert Im Stapelspeicher wird gemäß den Merkmalen des Stapelspeichers zunächst obj2 zerstört, wenn es zuerst rein, zuletzt raus, obj2 natürlich zuerst zerstört wird, das heißt, die Zerstörung von obj2 wird zuerst ausgeführt, und dann wird obj1 zerstört, das heißt, die _destruktion von obj1 wird ausgeführt. Dies erklärt auch Ihr Bestellproblem.

Das zweite Problem: Das übergeordnete Klassenobjekt wird nicht generiert. Wenn Sie eine Unterklasse instanziieren, befinden sich die öffentlichen und geschützten Methoden der übergeordneten Klasse auf dem instanziierten Objekt. Sie können also die Methode der übergeordneten Klasse aufrufen.

Das obige ist der detaillierte Inhalt vonWarum führt PHP den Destruktor eines Objekts aus, das zuerst instanziiert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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