Tom: Objekt löschen mit unset() ?

Beitrag lesen

Hello,

Ich habe jetzt einmal probiert, nach der while-Schleife mit "unset($bbcode);" das Objekt zu löschen.
Funktioniert das so oder würde das nur bei Variablen funktionieren?

Man muss hier unterscheiden, wann man die Instanz wieder loswerden will und wann man einen echten Destructor benötigt. Der Destructor wird üblicherweise dann aufgerufen, kurz bevor ein Programm stirbt oder ein Gültigkeitsbreich verlassen wird. Es sind noch Dinge zu erledingen, und außerdem soll die Instanz sich selber aus dem Speicher entfernen.

Das funktioniert bei Interpreter-Sprachen sowieso meistens anders. Da ist die Instanzerzeugung vollständig Bestandteil (Kind) des Runtime und bekommt von diesem den Speicher zugeteilt. Wenn man dann eine Instanzvariable (Zeiger auf die Instanz) wieder aus der Variablen liste entfernt, wird automatisch der gesamte daran angekoppelte Baum aus dem Speicher entfernt, bzw. wieder freigegeben. Eine Klasse kann man sich in PHP auch wie ein Multiarray vorstellen. In den Blättern sitzen die Eigenschaften und Funktionsnamen. Die Funktionen selber sind ohnehin im "Table of Functions" referenziert und damit linearisiert.

Es müsste in der Schleife dann auch keine Probleme machen, eine Instanzvariable einfach mit einer neuen Instanz zu überschreiben, sie für eine neue Instanz wiederzuverwenden, da PHP das ja bai Arrays auch zulässt. Die Beeitigung der alten Instanz findet (hoffentlich) automatisch statt.

Anders in einer Basisorientierten Hochsprache, wie z.B. Pascal.

Wenn ich da mit new(pointer) einen Speicherbereich allokiere und dann einfach nochmal mit new(pointer) dieselbe Instanzvariable nochmals belege, ist der Speicherbereich, den ich das erste mal besorgt hab, verloren Unter http://www.schoenleber.org/pascal/pascal2-06.html ist eine sehr schöne Erklärung zu finden. Man darf dann vor einer Neubelegung das dispose(pointer) nicht vergessen.

Wenn sichergestellt ist, dass in der Schleife immer dieselbe Instanzvariable benutzt wird und PHP sich zuverlässig um die Beseitigung der alten Instanz kümmert, musst Du in der Schleife gar nichts weiter tun und am Schleifenende nur die letzte Instanz mit unset() entfernen, wenn Du sie nicht mehr benötigst.

Die Klassendefinition selber wirst Du mWn leider gar nicht wieder los. Wenn das Script also länger läuft und mehree Aufgaben zu erledigen hat, könnte bei mehrfachen Includes schon ein Memory Overflow Error auftreten. Dadurch, dass die meisten Scripte aber nur 8ms (oder auch mal 30s) leben, wird der Speicher immer wieder automatisch freigegeben für andere Scripte.

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau