php Destruktor-Verhalten
ich versuche zu verstehen, php Konstruktor-und Destruktor-Verhalten. Alles geht wie erwartet mit dem Konstruktor, aber ich habe Probleme damit, den Destruktor zu Feuer implizit. Ive getan alles zu Lesen auf php.net und die damit verbundenen Websites, aber ich kann nicht finden, eine Antwort auf diese Frage.
Wenn ich eine einfache Klasse, so etwas wie:
class test{
public function __construct(){
print "contructing<br>";
}
public function __destruct(){
print "destroying<br>";
}
}
und ich nenne es mit etwas wie:
$t = new test;
druckt es die Konstruktor-Nachricht. Allerdings würde ich erwarten, dass wenn die Skripte endet und die Seite gerendert wird, die den Destruktor auslösen soll. Natürlich klappt es auch.
Wenn ich den Anruf unset($t); wenn die Skripte enden, natürlich der Destruktor feuert, aber gibt es einen Weg, um es zu Feuer implizit?
vielen Dank für alle Tipps
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ziemlich einfach zu testen.
In PHP 5.5.12 diese Drucke:
So können wir sehen, dass der Destruktor aufgerufen wird, wenn wir ausdrücklich unset das Objekt, wenn es geht out of scope, und, wenn das Skript beendet wird.
Den
__destruct()
magic-Funktion wird ausgeführt, wenn das Objekt gelöscht/zerstört (mitunset
). Es ist nicht genannt, die während des Herunterfahrens von einem Skript. Wenn ein PHP-Skript ausführen beendet, es räumt den Speicher auf, aber nicht "löschen" die Objekte als solche, also die__destruct()
Methoden werden nicht aufgerufen.Denkt man vielleicht an die
register_shutdown_function()
, das ausgelöst wird, wenn Sie Ihre PHP-Skript ausführen beendet.Mein Verständnis ist, dass Destruktoren werden automatisch aufgerufen, wird für alle verbleibenden Objekte, wenn das Skript endet.
Suchen, obwohl die Handbuch Seite auf Konstruktoren und Destruktoren, es scheint der einzige Weg zu umgehen Destruktoren vollständig ist, wenn Sie anrufen
exit()
aus der Destruktor für ein Objekt, das zerstört wird, bevor das Objekt in Frage stellen.Sind Sie mit
exit()
in Ihren Destruktoren? Sind es sogar mehrere Objekte in Ihrem Skript?Wenn es nicht zu viel Mühe macht, vielleicht könnten Sie schreiben den code in der Frage anstatt der Beispiel-code, den Sie in Ihrer Frage jetzt. Abgesehen von der typo in deinem Beispiel-Konstruktor im code sollte rufen sowohl die constuctor und Destruktor für Ihre
test
Objekt.exit
im Destruktor dann das erste mal das Objekt zerstört wird, rufen Sie eine Funktion registriert mitregister_shutdown_function
und dann rufen Sie eine andere Destruktoren. Wenn diese Destruktoren enthalten auch eineexit
dann wird das script beendet. also, den ersten Anruf zu beenden legt das script in den shutdown-Modus, der zweite zwingt Sie, sofort zu stoppen. Es sei denn, die 2. Ausfahrt ist innerhalb der shutdown-Funktion -, dass man verhält sich mehr oder weniger wie eine "Rückkehr".Die __destruct Methode einer Klasse wird aufgerufen, sobald alle Referenzen auf das Objekt gelöscht.
Beispielsweise
Den Destruktor wird automatisch aufgerufen, wenn das dummy-Objekt null gesetzt wird oder das Skript beendet wird.
Allerdings gibt es drei wichtige Speicher-Hinweise zum Aufruf des destructor-Methode:
Erstens, die desctructor Methode sollte eine öffentliche Methode, die nicht geschützt oder privat.
Zweitens, die Nutzung interner und zirkuläre Referenzen. Zum Beispiel:
Das folgende nicht funktionieren:
Drittens, zu entscheiden, ob Destruktoren aufgerufen werden, nachdem die Ausgabe gesendet wird. Mit
kann man bestimmen, ob alle Destruktoren aufgerufen werden, bevor das senden von Daten an Benutzer.
Sehen http://php.net/manual/en/language.oop5.decon.php für die Quellen und aufwändige Erklärungen von Magie zu zerstören, Methoden, Beispiele.
Methode
__destruct()
ist usless. Besser ist etwas wie das hier tun:__destruct()
sehr nützlich. Darauf zu erklären, warum Sie behaupten, dass es unnütz ist?