Hello,
Kommen wir damit zu den wichtigen Fragen: Welche Aufgabe(n) genau soll das Singleton erfüllen (geht eher in Richtung Tom, weil er es vorschlug)? Welche Eigenschaften bringt es mit, die der Erfüllung der Aufgabe entgegenstehen und welche sonstigen Eigenschaften hat es, die sich in dem Fall ungünstig auswirken.
Das ist jetzt wieder das philosophische Problem, ob man im Gesamtkunstwerk PHP überhaupt OOP auf der Anwendungsprogrammiererseite braucht... Meine Meinung dazu kennst Du ja. Man bräuchte sie nicht, wenn die Namensraumverwaltung (Thema Verdeckung) etwas geschickter aufgebaut wäre.
Wenn ich das Ganze erstmal ohne OOP betrachte, dann möchte ich erreichen, das eine Anmeldung innerhalb eines Scriptdurchlaufes (ein Request) eineindeutig ist. Ich muss also genau eine Stelle haben, an der ich mir den Zustand merke und/oder genau ein Verfahren, mit dem ich den Zustand ermitteln kann. Viel schlimmer noch, der Zustand muss sogar an den nächsten Request weitergereicht werden könen!
Üblicherweise speichere ich mir das dann 'irgendwie' in der Session oder einem aus der Session abgeleiteten Datensatz meiner Datenhaltung.
Betrachten wir das Ganze jetzt mal mit OOP. Da sind die Eigenschaften an die Objekte gebunden. Außerhalb der Objekte hat es keine Eigenschaften zu geben. Das wäre ein Bruch der Vorgaben für OOP.
Wenn ich aber nun nur genau einen Zustand haben will inerhalb eines Scriptes, (oder sogar einer Folge von Requests) das als Gesamtkunstwerk ja aus hunderten von Klassen/Includes bestehen kann, dann muss ich dafür sorgen, dass immer dasselbe Objekt benutzt wird für die Ermittlung des Zustandes. Um dies zu erreichen fällt mir nur "Singleton" ein. Ob man dies nun durch eine äußere Hilfskonstruktion erzeugt, oder sauber durchstrukturiert, ist für den Zweck unerheblich.
Insbesondere die globalen Eigenschaften
ini_set('session.use_only_cookies', '1');
ini_set('session.use_trans_sid', '0');
im Konstruktor der Klasse zu verwursten, halte ich für bedenklich.
Definitiv ja.Begründung und Alternativen wären sehr hilfreich.
Wenn ich diese Voreinstellungen nur als Direktive einsetze und nicht als Sensitive mit anschließender Direktive und Wiederherstellung des vorherigen Zustandes, dann halte ich das für bedenktlich. Entweder, sie gelten für die gesamte Abarbeitung des Request, oder wenn ich einräume, dass dies nicht der Fall sein könnte, muss ich die Änderung der Einstellung an die Nutzung der Methoden des Objektes binden und nicht an die Instantiierng. Es dürfte dann also immer nur für die Dauer der Nutzung einer Methode die gewünschte Eigenschaft eingestellt werden und bei Ende der Methode, diese wieder auf den vorherigen Stand zurückgestellt werden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg