Das Handbuch sagte das
Die Destruktor-Methode wird aufgerufen, sobald alle Referenzen auf a bestimmte Objekte werden entfernt oder wenn das Objekt explizit ist zerstört oder in beliebiger Reihenfolge in der Abschaltsequenz.
Reicht die PHP-GC nicht aus? Könnte jemand ein Beispiel geben, dass __destruct
method notwendig ist?
Ein Destruktor hat nichts direkt mit der Freigabe von Speicher zu tun - stattdessen ist es ein "Hook", um zu ermöglichen, dass benutzerdefinierter Code ausgeführt wird, wenn das Objekt für eine Wiederherstellung in Frage kommt. Das heißt, es ist das Gegenteil des Konstruktors - der Konstruktor ordnet den Speicher nicht zu (wie es der GC vor dem Aufruf des Konstruktors tut), und daher gibt der Destruktor den Speicher nicht frei (z das wird später vom GC gemacht).
Der GC kann zwar native Ressourcen (z. B. andere Objekte und Objektdiagramme) verwalten, aber externe Ressourcen wie Dateihandles müssen immer noch "manuell entsorgt" werden. Stellen Sie sich zum Beispiel eine MyFile-Klasse vor, bei der der Destruktor sicherstellen würde, dass die Datei, falls geöffnet, geschlossen wäre - obwohl es "besser" ist, eine Operation zum Schließen / Disponieren des Objekts auszuführen, kann der Destruktor sein in diesem Fall als Rückfallmechanismus verwendet.
Ich würde gegen die allgemeine Verwendung von Destruktoren in Sprachen mit einem GC argumentieren. Es gibt eine Reihe von subtilen Problemen, die sie einführen können, wie zum Beispiel offensichtlicher Nicht-Determinismus und die Fähigkeit, Objekte aus Versehen am Leben zu erhalten - selbst in Sprachen wie PHP, die Referenzzählungen verwenden. (Die Java- / JVM- und .NET-Modelle verwenden Finalizer, die noch raffinierter sind.)
Glückliche Kodierung.
Wenn Sie Ausnahmen verwenden, sollten Sie RAII sogar mit PHP versuchen. Und Sie müssen Destruktoren für RAII verwenden. Es wurde für C ++ erfunden, aber die gleiche Logik funktioniert auch mit PHP. Seien Sie gewarnt, dass PHP in einigen Fällen (z. B. schwerwiegender Fehler oder wenn exit () aufgerufen wird) am Ende die Destruktoren in falscher Reihenfolge aufruft, was ich für einen Fehler in PHP Engine halte. Für normalen Code und Ausnahmen scheint die PHP-Engine so zu funktionieren, als wäre es C ++ - Programm.
Siehe auch: Kann ich der PHP __destruct () -Methode vertrauen, die aufgerufen werden soll?
Die __destruct
magic-Methode ist für PHP in dem Sinne notwendig, dass die power auf explizit, automatisch und konsistent die Anzahl der Referenzen für injizierte Objekte verringert (zB ein Datenbank-Wrapper-Objekt, usw.), die mit anderen Objekten geteilt werden, dann ist die __destruct
magic-Methode ein zuverlässiger und vorhersagbarer Platz dafür. Sicher, es ist eher eine Konvention als eine absolute Anforderung, aber warum das Rad neu erfinden (C ++, Java, etc ...)? PHP ist nicht nur für Webseiten gedacht, wir sollten das im Hinterkopf behalten.
Tags und Links php garbage-collection destructor