class Beispiel {
private $f; // erhält später den Rückgabewert von fopen()
public function __construct ($path) {
$this->f = fopen($path, 'r');
}private function __destruct () {
fclose($this->f); // wirft einen Fehler "Not a valid stream resource"
}public function close () {
$this->__destruct();
}
}
>
> Wenn ich die close-Methode aufrufe, erhalte ich den oben angemerkten Fehler, der sich auf den fclose-Aufruf in \_\_destruct() bezieht. Versetze ich den fclose()-Aufruf in die close-Methode selbst, erhalte ich den Fehler nicht. Den Hintergrund dahinter habe ich noch immer nicht verstanden.
>
> > Du hast allerdings nicht unbedingt eine Garantie, dass andere dir sonst in der Klasse zur Verfügung stehenden Objekte noch existieren. Vor allem bei zirkulären Referenzen muss man ja irgendwo mal anfangen mit dem Wegwerfen.
>
> Das könnte bereits die auch von mir vermutete Erklärung dazu sein.
Ist es nicht so, dass der Destruktor 2x Aufgerufen wird?
IIRC, war es doch bei PHP so, dass der Destruktor an sich auch nur eine 'einfache' Funktion ist und wenn man sie aufruft, das nicht gleichbedeutend damit ist, dass das Objekt zerstört wurde.
Das würde dann bedeuten, dass der Destruktor 2x aufgerufen wird. Einmal durch $obj->close() und einmal wenn wenn der GC durch läuft, was wiederum bedeutet, dass beim Aufruf durch den GC die Resource schon freigegeben wurde.
Oder liege ich gerade komplett daneben?
MfG
bubble
--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye