Christian Seiler: Singleton macht im Web bei PHP Verwendung keinen Sinn?

Beitrag lesen

Hallo Sven,

Singletons sind böse, gerade weil sie ein angehübschter Container für globalen Zustand sind. Man kann damit arbeiten, klar. Globale Variablen zerstören ja auch nicht instant das bekannte Universum. Aber sie haben eben den Nachteil, dass sie extrem schlecht testbar sind, und dass sie in der Regel irgendeinen eher obskuren globalen Zustand enthalten, den man nicht auf den ersten Blick erkennen kann. Und der sich, wenn irgendwas anderes, was auf diesen globalen Zustand auch Einfluss genommen hat, plötzlich wegfällt, vollkommen unerwartet verändern kann.

Deshalb: Hände weg von Singletons, sie fördern undurchsichtige, schwer testbare Programmstrukturen.

Als Faustregel ist das sicherlich in Ordnung, ich würde das persönlich aber lange nicht so dogmatisch sehen. (Anmerkung: Außer, es handelt sich um Bibliotheken. Globaler State hat in Bibliotheken nichts verloren.)

Und obendrein, das ist natürlich auch richtig, kann PHP gar keine wirklich ultra-globalen Singletons liefern, jegliches Singleton ist immer nur im Rahmen der einen gerade laufenden Skript-Instanz einzigartig - parallele Requests erzeugen in parallelen Skript-Instanzen immer parallele Instanzen des Singletons.

Wenn ich eine Desktopapplikation zweimal ausführe, die mit Singletons geschrieben wurde, erhalte ich in jeder Instanz natürlich auch ein anderes Singleton. Insofern gibt es 'ultra-globale' Singletons schlichtweg nicht. Irgendwo ist immer eine Grenze.

Zwar braucht man meiner persoenlichen Erfahrung nach abstrakte Methoden und Klassen in PHP sehr selten (weil man das oft durch Interfaces besser machen kann), aber das heisst nicht, dass sie nicht grundsaetzlich nuetzlich sind. Und es ist garantiert nichts verwerfliches dabei, die zu verwenden.
[Erklärung zu Interfaces, abstrakte Klassen]
Beide Arbeitsweisen gehören für mich absolut zum Handwerkszeug vernünftiger OOP. Insofern ist diese Aussage ohne Begründung nicht viel wert. Und selbst mit Begründung hätte ich Zweifel, ob ich der Meinung zustimmen könnte.

Deinen Erklärungen zu Interfaces / abstrakten Klassen kann ich generell zustimmen, meine Aussage "durch Interfaces besser" bezog sich lediglich auf "meine persönliche Erfahrung": In 99% aller Fälle, in denen ich irgendwie in PHP eine abstrakte Klasse angefangen habe zu schreiben, habe ich später festgestellt, dass ich das, was ich wollte, eigentlich besser mit einem Interface hätte lösen können. Das hat nichts damit zu tun, dass ich abstrakte Klassen nicht mag, ich hab auch kein Problem, sie zu verwenden, wenn sie das beste Mittel zur Wahl sind - aber zumindest in den Problemstellungen, die ich bisher in PHP gelöst habe (andere Programmiersprachen sind etwas anderes!), war meine Erfahrung eben die, dass ich so gut wie nie eine abstrakte Klasse gebraucht habe.

Viele Grüße,
Christian