Statische Methode ruft Constructor auf

14 04 2009

Ich hocke gerade an einem mod_rewrite Problem mit dem vielversprechenden CMS Concrete5. Jetzt muss mir mal jemand erklären, wieso etwas so programmiert sein könnte, wie es da gemacht wurde:

Ganz am Anfang des Ablaufs (im Dispatcher) wird indirekt die Klasse "Request" initialisiert: $req = Request::get();. Diese statische Methode get() holt sich die Request-Parameter (da liegt übrigens mein Problem) und instantiiert dann mit $req = new Request($path); eine neue Instanz der eigenen Klasse und gibt diese zurück. Jetzt frage ich mich, warum zur Hölle instatiiert nicht der Dispatcher die Klasse und deren Constructor ruft die get() Methode auf (oder macht die paar Zeilen direkt im Constructor)? Warum wird von einer Klasse eine statische Methode aufgerufen, die eine neue Instanz der eigenen Klasse aufmacht und zurückgibt? Wozu also der Umweg über die statische Methode? Ist sowas irgendwo üblich? Wenn ja, was wird bezweckt?

Mein Respekt gilt schon mal allen, die bis hierher gelesen haben. ;)



Trackbacks


Keine Trackbacks

Kommentare

Ansicht der Kommentare: (Linear | Verschachtelt)
14 04 2009
#1 Jan (Antwort)

http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Grob zusammengefasst: so kann/soll erreicht werden, dass eine Klasse nur einmal instanziiert wird.
15 04 2009
#1.1 Gregor Nathanael Meyer (Antwort)

Ah danke, so sieht das hier aus, bis auf die fehlende Prüfung, ob es bereits eine Instanz gibt (und der Constructor ist auch public). Es wird einfach bei jedem Aufruf von get() eine neue Instanz generiert und zurück gegeben. Somit ist das gebaut wie ein Singleton, hat aber nicht die Funktionalität eines Singleton. Vielleicht für später mal vorgesehen, wer weiß. Der Name get() ist auch etwas irreführend, lässt sich immerhin leicht mir einem spezifischen Werte-getter oder dem generischen __get() verwechseln.

Juhu, wieder was gelernt.

Kommentar schreiben


Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
BBCode-Formatierung erlaubt