Sven Rautenberg: wie __destruct sinnvoll nutzen?

Beitrag lesen

Moin!

wer hat mit PHPs Objektorientierung genügend Erfahrung und kann mir sagen, ob ich das Prinzip richtig verstanden habe? Hier meine Mutmaßungen, um deren Bestätigung bzw. Widerlegung ich bitte:

Da geht einiges durcheinander irgendwie.

Der wichtigste Punkt aus meiner Sicht: Ressourcen sind KEINE Objekte. Sonst wären es Objekte.

#1
In einem Objekt als Eigenschaften vorhandene Stream-Resourcen "sterben" in dem Moment, wo __destruct aufgerufen wird. Im Code (besser "scope") dieser speziellen Funktion (alias Methode) habe ich keine wirklich existierenden Referenzen auf Stream-Resourcen mehr. Anscheinend hat es nur dann einen Sinn diese Methode zu notieren, wenn man im Rahmen der Vererbung eventuelle Elternobjekte "sterben lassen" möchte.

Nein, die Ressourcen "sterben" in dem Moment, wo die Variable vom Garbage Collector weggeräumt wird. Das ist NACH dem Durchlaufen des Destructors, denn während der Code im Destruktor läuft, existiert das Objekt noch.

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.

#2
Stream-Resourcen werden beim Zerstören des Objektes automatisch von PHP geschlossen. Entweder durch das explizite Aufrufen von __destruct(), oder durch ein unset($obj).

Stream-Ressourcen sind auch nur Ressourcen. Seit wann haben die Methoden? Also können sie auch keinen Destruktor haben, den man aufrufen kann.

Bisherige Erkenntnisse:
Ich habe mir eine Funktion gebastelt, die die Resource korrekt schließt, um anschließend $this->__destruct() aufzurufen. War das so im Sinne des Prinzips?

Nein. Das Schließen einer Ressource gehört IN den Destruktor. Man ruft Destruktoren auch nie explizit auf, sondern allerhöchstens implizit durch unset($object).

Debug-Ausgaben liefern auch innerhalb des Codes von __destruct Eigenschaften des Objekts, auch der "file handles" (konkret: "Resource id #7"). Trotzdem scheitert dort ein Aufruf von fclose() mit der Fehlermeldung, es handle sich um keine gülte Stream-Resource. Daher mein Umweg über eine "vorgeschaltete" Methode.

Du hast irgendwas gebastelt, was man ohne Code nicht beurteilen kann.

- Sven Rautenberg