Lieber Sven Rautenberg,
ich habe eine Klasse in etwa dieser Form:
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.
Nein. Das Schließen einer Ressource gehört IN den Destruktor.
Also doch so, wie oben beschrieben? Mit der passenden Fehlermeldung?
Man ruft Destruktoren auch nie explizit auf, sondern allerhöchstens implizit durch
unset($object)
.
Das habe ich durch diesen Thread jetzt gelernt. Davor war mir der Sinn für diese __destruct-Methode überhaupt nicht klar.
Liebe Grüße,
Felix Riesterer.
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)