__destruct()
mod
- php
Hallo SelfHTML-Forum,
ich habe eine Frage zu __destruct(). Bereits Sven Rautenberg hat empfohlen die Datenbankverbindung über DB::__construct() mit zu starten und über DB::__destruct() automatisch zu beenden.
Ebenfalls soll in einer Session-Tabelle die Variable "Letzter Seitenbesuch" (Uhrzeit) aktualisiert werden. Diese würde ich auch gerne über Session::__destruct() ausführen. Im Script wird DB::__construct() und später dann Session::__construc() aufgerufen.
Dann wenn zu erst DB::__construct() aufgerufen würde, könnte die Session-Tabelle nicht mehr aktualisiert werden!
Gruß, mod.
Tach!
Bereits Sven Rautenberg hat empfohlen die Datenbankverbindung über DB::__construct() mit zu starten und über DB::__destruct() automatisch zu beenden.
So pauschal kann er das nicht gemeint haben. Sicherlich hatte er dabei deinen konkreten Anwendungsfall mit berücksichtigt.
- Ist es richtig, dass __destruct() aufgerufen wird, wenn das Script beendet oder vorzeitig abgeebrochen wird?
Welche Aussage trifft dazu das PHP-Handbuch?
Wie sieht's bei einer Weiterleitung mit header('location: ... ') aus?
Eine Weiterleitung ist aus Serversicht lediglich diese Header-Ausgabe. Das PHP-Script arbeitet ansonsten wie jedes andere PHP-Script auch.
- In welcher Reihenfolge werden die Destruktoren aufgerufen?
Welche Aussage trifft dazu das PHP-Handbuch?
Dann wenn zu erst DB::__construct() aufgerufen würde, könnte die Session-Tabelle nicht mehr aktualisiert werden!
__destruct() meinst du wohl. Du könntest das Schließen der Verbindung einfach dem eingebauten Aufräummechanismus PHPs überlassen.
dedlfix.
Mal ein Test-Script geschrieben:
<?php
error_reporting(-1);
class N1 {
function __construct()
{
echo 'Anfang1<br>';
}
function __destruct()
{
echo 'Ende1<br>';
}
}
class N2 {
function __construct()
{
echo 'Anfang2<br>';
}
function __destruct()
{
echo 'Ende2<br>';
}
}
$n1=new n1;
$n2=new n2;
?>
liefert:
Anfang1
Anfang2
Ende2
Ende1
Genauso wie ich es brauche.
Das ist aber ein wirklich überschaubares Beispiel.
In der Regel hat man ja eher Instanz in anderen eingeschoben oder noch ungünstiger, irgendwo bei PHP für irgendeinen Callback registriert. Dann sieht das ziemlich schnell ziemlich anderes aus 8)
Hallo dedlfix.
- In welcher Reihenfolge werden die Destruktoren aufgerufen?
Welche Aussage trifft dazu das PHP-Handbuch?
PHP.net schreibt:
Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein
bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört
wird, oder in beliebiger Reihenfolge am Ende des Skripts.
Beliebige Reihenfolge, dass ist das was ich nicht brauche!
Dann wenn zu erst DB::__construct() aufgerufen würde, könnte die Session-Tabelle nicht mehr aktualisiert werden!
__destruct() meinst du wohl. Du könntest das Schließen der Verbindung einfach dem eingebauten Aufräummechanismus PHPs überlassen.
Korrekt - das wäre mir aber zu unsauber.
Die Reihenfolge der Destruktoren kann man nicht festlegen ?
Gruß mod.
Hi,
PHP.net schreibt:
Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein
bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört
wird, oder in beliebiger Reihenfolge am Ende des Skripts.Beliebige Reihenfolge, dass ist das was ich nicht brauche!
Dann zerstöre deine Objekte explizit in der gewünschten Reihenfolge?
~dave()
Die Aussage des Handbuch scheint mir recht missverständlich, oder wie sollten in PHP Objekte/Instanzen mit existierenden Referenzen explizit zerstörbar sein?!
Tach!
Die Aussage des Handbuch scheint mir recht missverständlich, oder wie sollten in PHP Objekte/Instanzen mit existierenden Referenzen explizit zerstörbar sein?!
Es könnte sich dabei um einen Übersetzungsfehler oder eine mittlerweile korrigierte aber noch nicht übersetzte Aussage handeln. Das Original jedenfalls ist: The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence. Also, Referenzen auflösen führt zum Destruktor-Aufruf.
dedlfix.
Die Aussage des Handbuch scheint mir recht missverständlich, oder wie sollten in PHP Objekte/Instanzen mit existierenden Referenzen explizit zerstörbar sein?!
Es könnte sich dabei um einen Übersetzungsfehler oder eine mittlerweile korrigierte aber noch nicht übersetzte Aussage handeln. Das Original jedenfalls ist: The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence. Also, Referenzen auflösen führt zum Destruktor-Aufruf.
Jo, muss wohl ein Übersetzungsfehler sein. Obwohl ich mir ein "gnadenloses" destroy($instance) schonmal gewünscht hab, ich weiss nur nicht mehr in welchem Zusammenhang.)
Tach!
Du könntest das Schließen der Verbindung einfach dem eingebauten Aufräummechanismus PHPs überlassen.
Korrekt - das wäre mir aber zu unsauber.
Der Aufräummechanismus ist im Prinzip nichts anderes auch, als das automatische Aufrufenlassen der Destruktoren.
Die Reihenfolge der Destruktoren kann man nicht festlegen ?
Den Destruktoren am Scriptende ihren Lauf zu lassen ist dir anscheinend nicht zu unsauber. Wenn dir die zufälligen Aufrufe nicht behagen, kannst du nur explizit selbst die Situationen herbeiführen, die einen Destruktoraufruf bewirken.
dedlfix.