2010-08-08 7 views
14

Dies ist mein erstes Mal auf stackoverflow, aber ich habe diese Threads mir enorm geholfen!Gibt es Fälle, in denen der Destruktor in PHP NICHT aufgerufen wird?

Anywho, auf meine Frage ... gibt es irgendwelche Fälle, wenn der Destruktor in PHP nicht aufgerufen wird? Der Grund, warum ich frage, ist, weil ich eine Mapper-Klasse habe, die Daten auf Objekte abbildet, und im Konstruktor beginne ich eine Transaktion und im Destruktor rufe ich einen Commit auf (ich habe auch eine Member-Funktion, die auch die Commit-Funktion ausführen kann) , Falls benötigt). Wenn es Fälle gibt, in denen der Destruktor nicht aufgerufen wird, würde ich es gerne wissen, damit ich es vorhersehen und entsprechend planen kann.

Vielen Dank!

Antwort

14
  • Nach dem manual werden Destruktoren ausgeführt, auch wenn das Skript die() oder exit() Verwendung beendet wird:

    The destructor will be called even if script execution is stopped using exit(). Calling exit() in a destructor will prevent the remaining shutdown routines from executing.

  • zu this SO question Nach der destructor tut nicht ausgeführt werden, wenn die PHP-Ausführungszeit Limit ist erreicht (Bestätigt auf Apache 2, PHP 5.2 auf Windows 7).

  • Der Destruktor tut auch nicht wird ausgeführt, wenn das Skript beendet wird, weil das Speicherlimit erreicht wurde. (Just getestet)

  • Die destructor tut auf fatale Fehler bekommen ausgeführt (Just getestet) Update: Die OP nicht bestätigen kann - es scheint fatale Fehler zu sein, wo die Dinge anders

  • Es tut nicht auf Parse-Fehler ausgeführt werden soll (weil das ganze Skript nicht interpretiert werden)

  • der Destruktor wird sicherlich nicht ausgeführt werden, wenn der Server-Prozess abstürzt oder eine andere Ausnahme von PHP-Steuerung auftritt.

Alles in allem sieht es ziemlich zuverlässig aus.

Der Nachteil anderer Dinge als Säuberung im Destruktor ist jedoch, dass Ihre Möglichkeiten dort etwas begrenzt sind. Sie können keine Ausnahmen mehr auslösen (außer wenn Sie sie innerhalb des Destruktors wieder abfangen), Sie können keine Fehlermeldungen ausgeben, Sie können sich nicht wirklich auf das Vorhandensein anderer Objekte (wie der Datenbankschnittstelle) verlassen. .... Ich habe keine große Erfahrung in der Arbeit mit Destruktoren, aber ich bin mir nicht sicher, ob das, was Sie vorhaben, eine machbare Idee ist.

+0

Vielen Dank! :) Ich hatte diesen Ausschnitt aus dem Handbuch gelesen, dachte mir aber, ich würde versuchen, in Sicherheit zu sein, indem ich auch hier frage. Ich habe gerade getestet, was passiert ist, als ein schwerwiegender Fehler auftrat. Alles, was ich getan habe, wurde ein Mitglied erstellt, das versucht, ein nicht existierendes Mitglied anzurufen. Der Destruktor wurde NICHT aufgerufen. Es wird natürlich mit Warnungen und unten aufgerufen. Ansonsten kann ich nicht an andere Instanzen denken, die überprüft werden könnten, ob es aufgerufen wird. Ich nehme nur an, es tut und umfangreiche Tests! Danke nochmal! –

+0

@Logan du bist willkommen. Interessante Sache über den fatalen Fehler: Es funktionierte für mich, wenn ich einen mit '$$ fake() provozierte;' Vielleicht hängt es von der Art des Fehlers ab. Schauen Sie sich auch den Absatz an, den ich gerade hinzugefügt habe, mit einigen Gedanken zur allgemeinen Idee. –

+0

danke für die extra Info! Ich habe gerade getestet, ob ich was in einem Destruktor machen könnte. Soweit ich weiß, kann ich eine Member-Funktion der gleichen Klasse und eine Member-Funktion einer anderen Klasse aufrufen (aus dem Konstruktor instanziiert). Vielleicht kann ich tun, was ich tun wollte, ich werde einen weiteren Kommentar posten, sobald ich es herausfand. –

2

Ich möchte nur hinzufügen, wenn Sie einen schwerwiegenden Fehler in einem Destruktor haben, kann es andere Destruktoren von der Ausführung stoppen.

Verwandte Themen