dedlfix: wie __destruct sinnvoll nutzen?

Beitrag lesen

Tach!

OK... Und wie mache ich es "am besten" mit meiner geöffneten Datei? Lasse ich einfach $obj->f stehen und benutze ein unset($obj), womit das Dateihandle jetzt sofort geschlossen wird, oder muss ich vor dem unset() noch irgendwie ein fclose() ausführen lassen (z.B. innerhalb der close-Methode), weil der GC mit dem Schließen der Datei noch länger auf sich warten lassen könnte?

Es kommt drauf an, was man eigentlich will. Man muss auch noch stark unterscheiden zwischen einem langlaufenden Desktop-Programm (bei PHP eher selten) und einer kurzen Request-Abarbeitung. Es ist nur eingeschränkt sinnvoll und nützlich, das bei Desktop-Programmierung gelernte Verhalten, nach Gebrauch alles ordentlich aufzuräumen, auf PHP überzustülpen. Hat man etwas, das die gesamte Zeit des Requests über benötigt wird, dann kann man das Schließen sehr gut PHP überlassen. Hat man dagegen (und leidet vielleicht auch noch unter Ressourcenknappheit) einen abschließbaren Vorgang, dann gehört (für mich zumindest) das Öffnen und Schließen von Ressourcen in diesen Vorgang. Es ist integraler und nicht nebensächlicher Bestandteil dessen.

Was ich noch überhaupt nicht verstanden habe, ist die Frage, on __construct() bzw. __destruct() eine "public" oder "private" Funktion sein sollte, und warum.

Konstruktor-Funktionen können sowohl als auch sein, je nachdem, ob man Objekte öffentlich per new instantiieren will oder nicht. Der "Oder-Nicht"-Fall wäre gegeben, wenn man für das Erzeugen eines Objektes mehr als nur new(+parameter) erledigen muss (und man eine Factory-Methode verwenden soll, um ein Objekt zu bekommen).

Von C# kenne ich es, dass man einem Destruktor keine Sichtbarkeit definieren kann. Es ist nicht vorgesehen oder möglich, ihn selbständig aufzurufen (außer vielleicht über Reflection - egal). Wenn du den Destruktor in PHP private deklarierst, beschwert sich PHP, wenn es aufräumen will. Am besten lässt du den Sichtbarkeitsvermerk weg, dann wird es public oder setzt ihn explizit public.

dedlfix.