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.
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
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
Obj(1) 启动,申请自己的内存空间与上下文环境 Obj(2) 启动,申请自己的内存空间与上下文环境 Obj(2) 销毁,垃圾回收 Obj(1) 销毁,垃圾回收
---------------------------- 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!