Lieber Sven Rautenberg,
Oder du schließt sie implizit im Destruktor. Dann wird die Ressource geschlossen, wenn das Objekt gelöscht wird. Wann das ist, ist nicht garantiert.
das bedeutet, wenn ich keine __destruct()-Methode notiere, dann wird die Ressource am Ende des PHP-Prozesses automatisch vom GC geschlossen, notiere ich hingegen die __destruct()-Methode und in ihr ein fclose($this->f), dann wird die Ressource _vielleicht_ schon früher geschlossen - vielleicht auch nicht?
Wenn der Destruktor die Datei schließt, aber der Zeitpunkt nicht garantiert nach dem "unset()" liegt, sondern auch irgendwann bis hin zum Skriptende passieren kann, und das für die Applikation auch keine Rolle spielt, kann man auf das explizite Schließen auch verzichten, und es die Aufräumroutine von PHP machen lassen.
Das scheint zu bestätigen, dass ich mit einem simplen unset($obj) nicht sicher sein kann, dass die Ressource _sofort_ geschlossen wird, auch nicht, wenn ich im Destruktor explizit fclose($this->f) notiere.
Wenn man hingegen explizit die Datei schließen muss, kann man es nicht im Destruktor machen. [...]
Braucht man es explizit, erstellt man dafür eine eigene Methode.
Und dann muss man - wie schon erwähnt wurde - dafür sorgen, dass das Objekt anschließend nicht mehr "funktioniert", da ja die Ressource nicht mehr existiert.
Ich glaube, jetzt habe ich die Zusammenhänge genügend verstanden. Ich fasse zusammen:
1. Ressourcen werden irgendwann, insbesondere am Ende eines Scripts geschlossen, wenn man das Schließen PHP überlässt. Auch wenn man in einem Objekt eine Ressource abspeichert und im Destruktor deren Schließung explizit notiert, hat man keine Kontrolle darüber, wann die Ressource tatsächlich geschlossen wird.
2. Will man eine Ressource zu einem definierten Zeitpunkt schließen, so muss man das explizit (bei in Objekten abgespeicherten Ressourcen außerhalb des Destruktors) tun. Ist ein Objekt auf das Vorhandensein einer in seinen Eigenschaften abgespeicherten Ressource angewiesen, so muss ich sicherstellen, dass nach dem expliziten Schließen einer solchen Ressource mein Objekt irgendwie trotzdem klarkommt.
Liebe Grüße,
Felix Riesterer.
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)