Heim  >  Artikel  >  Backend-Entwicklung  >  Lösung eines Problems mit dem PHP-Destruktor

Lösung eines Problems mit dem PHP-Destruktor

黄舟
黄舟Original
2017-07-02 10:15:411137Durchsuche

Mit der weit verbreiteten Entwicklung der objektorientierten Programmierung hat die objektorientierte Programmierung viele interessante Probleme aufgedeckt. Ich glaube, dass viele Anfänger beim Erlernen von PHP objektorientiert mit zwei Funktionen in Berührung kommen werden, Konstruktor und Destruktor. Es scheint, dass Konstruktoren häufiger und Destruktoren weniger verwendet werden (im Verhältnis zur begrenzten Programmiererfahrung von Anfängern gilt das Gleiche auch für den Autor). Funktionell wird der Konstruktor aufgerufen, wenn das Objekt erstellt, und das Der Destruktor wird aufgerufen. Die Funktion wird aufgerufen, wenn das Objekt zerstört wird, und es ist nicht erforderlich, sie speziell aufzurufen.

Die Aufgaben, die Destruktoren häufig erledigen, sind einige Ressourcenfreigabeaufgaben. Beispielsweise wird fopen() vorher aufgerufen, fclose() wird hier aufgerufen, imagecreatefromjepg() wird zuvor aufgerufen und imagedestory() wird hier aufgerufen. Dies sind einige häufige Beispiele, die natürlich nicht darauf beschränkt sind. Wir können es als eine gewöhnliche Funktion behandeln, die ausgeführt wird, wenn das -Objekt zerstört wird oder das Skript abgeschlossen ist .

So viel Ausführlichkeit, lassen Sie uns die heutige Hauptfrage so früh wie möglich stellen:

<?php
class Test{
    public function destruct(){
        echo "执行析构函数";
    }
 }
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";

Was ist das Ergebnis der Ausführung dieses Skripts?

Bevor Sie diese Frage beantworten, werfen Sie noch einmal einen Blick auf die Wörter, die ich oben markiert habe. Wir können davon ausgehen, dass vor der Ausgabetrennzeile unset($test1) der Destruktor aufgerufen und der Text ausgegeben wird. Wie für $test2,$test3 sollte den Destruktor aufrufen, nachdem das Skript ausgeführt wurde. Das heißt, ein Textabsatz wird oberhalb der Trennlinie und zwei Textabsätze unterhalb der Trennlinie ausgegeben. Zu diesem Zeitpunkt können Sie ein wenig stolz sein, schließlich wissen Sie, wann Sie den Destruktor aufrufen müssen. Aber ist das wirklich so? Wir können uns die Ausführungsergebnisse ansehen.

Hey, verdammt, warum hast du gerade einen Satz ausgegeben? ? ?

Tatsächlich haben wir eine wichtige Voraussetzung übersehen, nämlich dass die Standardzuweisung von Objekten die Referenzzuweisung ist. Vielen Menschen ist das nicht aufgefallen, und ich hoffe, dass Anfänger dem mehr Aufmerksamkeit schenken können.

Da es sich um eine Referenzzuweisung handelt, kamen wir in Kombination mit unserem Verständnis gewöhnlicher Variablen schnell zu dem Schluss, dass die drei Variablennamen auf dieselbe Speicheradresse verweisen. Wenn dies also der Fall ist, welche Rolle spielt unset($test1)? ? ? Zerstören Sie die Variable, die auf die Speicheradresse zeigt, oder zerstören Sie den in der Speicheradresse gespeicherten Inhalt?

Wenn Sie wissen, wie man die Funktion unset() verwendet, überspringen Sie bitte diesen Absatz.

Schauen Sie sich angesichts dieses schmerzhaften Problems doch mal das Handbuch an.

Dasselbe wird als Referenz übergeben, nur der Variablenname, der auf die Speicheradresse zeigt, wird zerstört. In Kombination mit der normalen Funktion von unset() können wir es so beschreiben: Wenn mehrere Variablennamen oder Objektnamen auf eine Speicheradresse verweisen, besteht die Funktion der Funktion unset() nur darin, die Zeiger der Variablen zu zerstören Wenn es nur einen Variablennamen oder einen Objektnamen gibt, wird durch unset der Inhalt an der angegebenen Speicheradresse zerstört.

Wir können uns vorstellen, dass der eigentliche Speicherinhalt ein Fernseher ist. Mehrere Personen (mehrere Variablennamen oder Objektnamen) schauen fern. Nach unset() hörte niemand auf zu schauen und ging, aber der Fernseher lief immer noch. Wenn nur eine Person fernsieht, muss nach unset () der Fernseher ausgeschaltet werden, wenn die Person geht, um den belegten Speicherplatz freizugeben. Wenn Sie sich für diesen Teil des Inhalts interessieren, können Sie sich auch „Drei Implementierungsmethoden von PHP Rekursive Funktion“ ansehen.

Okay, zurück zum Thema. Nach unset($test1) ist das ursprüngliche Objekt immer noch vorhanden. Bei Ausgabe der Trennlinie wird das Skript ausgeführt und der Destruktor aufgerufen. Da es nur ein Objekt gibt, wird der Destruktor nur einmal aufgerufen. Es ist selbstverständlich, die oben genannten Ergebnisse auszugeben.

Mehrere andere verwandte interessante Fragen: Es gibt viele Möglichkeiten, den Destruktor im Programm aufzurufen. Unabhängig davon, ob das Objekt auf null oder false gesetzt ist, bleiben andere Objekte davon unberührt. Dies unterscheidet sich immer noch von gewöhnlichen Variablen. (Die Wirkung der Funktion unset() ist dieselbe). Wenn Sie interessiert sind, können Sie es versuchen.

Eine weitere peinliche Sache: Wir alle wissen, dass der Konstruktor „construct()“ verwenden kann, aber wir ignorieren den Konstruktor mit demselben Namen. Also sollte jeder aufmerksam sein.

Das obige ist der detaillierte Inhalt vonLösung eines Problems mit dem PHP-Destruktor. 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