The Blog that never sleeps

Olbertz.de

Const für Klassenmethoden in PHP

TAGS: None

Bei meinem letzten Ausflug zu PHP und C++ ist mir eine Sache wieder eingefallen, die ich in C++ immer sehr interessant fand und mir bei PHP irgendwie fehlt.

Man kann dort nämlich Klassenmethoden das Schlüsselwort const nachstellen und teilt dem Compiler somit mit, dass diese Methode das Objekt nicht verändert. Versucht sie es doch, gibt es einen Fehler beim übersetzen.

Hier wird das ganze noch mal ausführlicher erklärt (englisch). Auch wenn die Erklärung durch die ganzen Zeiger in C/C++ erheblich komplizierter wird :-)

Diese const-Deklarationen zwingen einen bei der Entwicklung dazu, genau zu überlegen, was man da eigentlich macht. Denn natürlich dürfen auch alle Methoden, die man innerhalb einer const-Methode benutzt, das Objekt selbst wieder nicht verändern… So manches leichtfertiges “ich mache hier mal ein const hin, da die Methode ja eh nix verändert” kann dann in ganz schön viel Arbeit ausarten.

Aber gerade bei der Verwendung eines Frameworks wäre es an einigen Stellen ganz hilfreich zu wissen, wo Daten verändert werden und wo nicht. Und natürlich auch in meinem eigenen Code.

Gibt es dazu in PHP eigentlich Überlegungen, etwas ähnliches einzuführen? Und wie sieht es bei anderen webaffinen Programmiersprachen aus?

Garbage Collection in PHP

TAGS: None

Ich war gestern Teilnehmer an einer kleinen Diskussion zum Thema Garbage Collection in PHP. Im Gegensatz zu z.B. JAVA verwendet PHP einfaches Reference Counting um zu ermitteln, welche Speicherbereiche nicht mehr benötigt werden. Wenn sich nun aber Objekte gegenseitig referenzieren - auch gerne über sehr viele Zwischenobjekte - versagt diese Strategie letztendlich.

Das ist ganz klar ein Schwachpunkt gegenüber z.B. JAVA, wo es auch GC Strategien gibt. Ich fand meine Reaktion darauf aber ganz interessant. Das Problem wurde nämlich anhand einer doppelt verketteten Liste erläutert und mein erster Gedanke war: wo ist das Problem? Eine solche Liste sollte doch mit Klassen implementiert werden und dann muss halt der Destructor der Liste dafür sorgen, dass alle Elemente darin gelöscht werden.

Als Gegenargument kam dann, dass der Destructor ja nicht zwangsläufig aufgerufen werden muss. Was natürlich stimmt und was ja auch überhaupt erst eine Garbage Collection notwendig macht. Meine frühen Erfahrungen mit C/C++ haben mich aber so sehr darauf getrimmt, immer schön aufzupassen, was ich mit meinem allokierten Speicher mache, dass ich dieses Verhalten auch auf PHP übertragen habe.

Bei PHP kommt ja nun noch hinzu, dass es meisten in einer Webumgebung eingesetzt wird und somit nur ein kurzlebiger Prozess abläuft. Da wird es in den meisten Fällen keinen Unterschied machen, ob zwischendurch die Garbage Collection aufräumt, oder das mit Ende des Prozesses vom Interpreter erledigt wird.

Sobald man PHP aber auch für lang laufende Aufgaben einsetzt. wie z.B. eigene Daemons, sollte man den Speicherverbrauch genau im Auge behalten.

© 2009 The Blog that never sleeps. All Rights Reserved.

This blog is powered by Wordpress and Magatheme by Bryan Helmig.