Also ich weiß ja nicht was dieses Kontrukt soll, aber es hat einfach mehr Nachteile als Vorteile. Wenn es überhaupt Vorteile haben sollte, dann das man scheiß Code schreiben kann.
Ein Singleton zeichnet sich halt dadurch aus, dass es eine statische Funktion zum beziehen des Singletons hat und die Restlichen nicht umsonst normal definiert sind.
Du machst eine Erweiterbarkeit zwar vielleicht möglich, aber es verwirrt den nächsten Programmierer und verleitet ihn so ein Mist weiter fortzuführen. Diese komischen, wie nennt sie DrakeL nochmal, Interzeptormethoden verleiten nur dumme Konstrukte zu schrieben, weil man zu Faul ist alles einzeln hinzuschreiben. Mir kommts so vor, als würden die Entwickler von PHP zuviel scheiss bei Perl abschauen und versuchen eine automatische Obfuskation des Codes zu erzwingen.
Kommen wir mal zu den Nachteilen:
1. Wenn du mir zb. die Klassenbeschreibung (also nur die vorhandenen Funktionen) vorlegst, dann sehe ich darin eine statische Klasse. Gut dann würde ich auch so damit arbeiten. Die Klasse heißt aber Singleton. Nun könnte man auch denken: Ok das ding heißt Singleton also benutze ich es auch so, weil ich ja weiß, wie sie so eine Klassenstruktur aufgebaut ist. Das kann ich zwar machen, indem ich Instance() aufrufe und dein static-call gedöhns da einfach übersehe, aber dann haste 2 Codekulturen im Projekt. Macht das weitere Arbeiten an dem Projekt zur Qual.
2. Wird bei jeder Funktion, die du da aufrufst genau das aufgerufen:
- statische Funktion Instance
- Überprüfung welche Instanz denn nun zurückgeben muss bezogen auf den Klassennamen
- Rückgabe der Instanz
- Aufruf der Funktion
So das sind für JEDEN Aufruf einer Funktion 4 Teile. Wobei das insgesamt 4 Funktionsaufrufe sind, eine Überprüfung und ein erstellen eines Arrays. (Wobei mich ein Benchmark zu der Funktion call_user_func_array zum normalen Funktionsaufruf mal interessieren würde). Achja und eine Zeichenkettenverknüpfung
Ich wills nochmal wiederholen: FÜR JEDEN AUFRUF
Richtiges Singleton-Pattern:
Kleiner Overhead am Anfang, weil man mit getInstance() die aktuelle Instanz holen muss. Maximal eine Überprüfung und gegebenfalls eine Erstellung von der Instanz.
Danach kommen die Funktionsaufrufe, die von php direkt übersetzt werden können. Die call_user_bla muss doch sicherlich erst nen Aufurf starten, obs die Klasse und so gibt. In welchem Scope läuft das dann eigentlich. Kann ich mit der Funktion dann auch protected oder gar private Funktionen aufrufen? Oder gehen da nur public Funktionen.
Geschweige denn die Sache mit dem Aufrufen irgendwelcher Funktionen, die es nicht gibt. Dann kommt ne schöne Fehlermeldung innerhalb der Klasse, aber nicht dort, wo der Fehler begangen wurde. Super Grundlage, um Fehlerbehebung zu betreiben.
Ich rate dir eins: Geh in dein Explorer und lösch die Dateien und mach die ordentlich. So kommt nur Scheisse bei raus oder mach sie gleich komplett statisch. Diese Interzeptormethoden sind nur sinnloses Spielzeug, was zu verdammt inkonsistenten Code führt und einfach mehr Probleme (lassen wir mal die Unübersichtlichkeit weg, die viel mehr eine Rolle spielen wird) als sie Vorteile schafft. Und man sollte nicht, nur weil man schreibfaul ist, auf so eine Dreckslösung zurückgreifen.
Und was ist wenn ich diese Singleton-Klasse ableite? Ich muss mich an Namensregeln halten. Man muss also immer ein __ davor machen. Sicherlich kann man den Code diesbezüglich in der Singleton-Klasse abändern, aber das hat keine Hand und kein Fuß.
Sorry das ich nun etwas ausfallender geworden bin, aber bei solchem Code könnte man kotzen, vorallem weil der wegen der Bequemlichkeit, die dadurch entsteht, nur zu scheiß Code führt.
edit:
Ich meine ein einfaches class DB2 extends DB {} und möglicherweise noch das hinzufügen der Logindaten, wie auch immer du das regelst. Das ist kein Designfehler, dieser Singleton erlaubt verschiedene Instanzen bei versch. vererbeten Klassen.
Also erbst du auch alle möglichen Funktionen von der Klasse DB, die du a) vielleicht nicht brauchst und b) vielleicht auch garnicht in dieser DB-Variante funktionieren. Na prima
edit2:
Wenn ich mich in Rage rede vergess ich immer was zu schreiben. Was passiert, wenn die Anzahl der parameter nicht stimmt? Wird sie trotzdem aufgerufen, oder wird sie dann nicht gefunden?