Moin!
"Die Destruktormethode wird aufgerufen, sobald es keine weiteren Referenzen auf ein bestimmtes Objekt mehr gibt, oder in beliebiger Reihenfolge am Ende des Skripts."
Ich finde es falsch, wenn man wichtige Dinge im Destruktor versteckt.
Bedeutet das, dass so etwas funktionieren würde:
class loadingTime{
public function __construct(){
$this->startTime= microtime(true);
}
public function __destruct(){
$this->endTime= microtime(true);
$this->loadingTime= $this->endTime- $this->startTime;
// in DB speichern
}
}
>
> und dann einfach einbinden?
Die Konsequenz wäre, dass du in deinem Code nun irgendwo ein Objekt erzeugst:
`$perform = new loadingTime();`{:.language-php}
Danach wird das Objekt nie mehr benutzt.
Jemand, der den Code liest, wird sich denken: "Warum zum Henker wird da eine ungenutzte Variable mit irgendeinem Objekt erzeugt?" Und er könnte versucht sein, diese sinnlos erscheinende Zeile zu löschen. Aus diesem Aspekt heraus klingt es nicht nach der besten Idee, den Destruktor für wichtige Arbeit zu verwenden, denn du ersetzt damit lediglich einen Aufruf einer Methode (zum Messen der Zeit) durch einen Nicht-Aufruf (es geschieht dasselbe, nur in einer Methode \_\_destruct).
Wie erwähnt, wird der Destruktor nicht garantiert sofort aufgerufen. Wenn man das irgendwie provozieren will, muss man das Objekt explizit löschen.
Eine Zeile wie die hier sagt mir aber nicht, dass da gerade eine Zeitmessung irgendwo hin gespeichert wird:
`$perform = null;`{:.language-php}
Halten wir also fest: Erstens kommst du nicht drum herum, zum Starten der Zeitmessung eine Zeile Code zu schreiben. Zweitens kommst du nicht drum herum, zum Beenden der Zeitmessung eine weitere Zeile Code zu schreiben.
Wenn du also sowieso zwei Zeilen Code schreiben musst, warum dann nicht durch den Methodennamen klar kommunizieren, was da passiert, anstatt es implizit über diese magischen Methoden zu machen.
Abgesehen davon hielte ich es für zuviel Aufgabe innerhalb einer Klasse, wenn der Timer gleichzeitig auch noch das Speichern in der Datenbank übernehmen sollte. Datenbankzugriff wird es vermutlich als Klassen schon geben. Der Timer muss also nur eine Zeit ausspucken.
Und zu guter letzt ist ja auch immer die Frage, wie genau so eine Messung sein kann, wenn DANACH noch irgendein Schreibzugriff auf eine Datenbank stattfindet.
> Wie kann ich sicher sein, dass \_\_destruct wirklich als letztes aufgerufen wird?
Du kannst dir bei \_\_destruct über keine garantierte Reihenfolge sicher sein. Insbesondere wenn du Objekte nutzen willst (z.B. für Datenbankzugriff), die ihrerseits eventuell schon weggeräumt wurden.
Der Destruktor ist einerseits das falsche Mittel, und andererseits hält er potentiell böse Überraschungen bereit. Vermeide ihn lieber. Mach die Dinge explizit dann, wenn du sie erledigt haben willst.
- Sven Rautenberg