Thes: Singleton-Pattern / mehrere Benutzer

Guten Abend allerseits,

Ich habe eine SQL-Klasse als Singleton realisiert.

  
static private $instance = NULL;  
private function __construct() { [..] }  
static public function GetInstance()  
{  
    if (self::$instance == NULL)  
    {  
        self::$instance = new SQLHandler();  
    }  
    return self::$instance;  
}  

Die Instanz bekomme ich dann ueber folgende Syntax:

  
SQLHandler::GetInstance();  

Die SQL-Klasse besitzt einige Membervariablen, ueber die man das Verhalten mancher Methoden manipulieren kann.
Diese kann man zB wie folgt setzen:

  
SQLHandler::GetInstance()->UseCach = true;  

Da ich eingentlich aus dem Java-Umfeld komme, und gewohnt bin mit einem Application-Server zu arbeiten, kommen
mir an dieser Stelle so ein paar Fragen auf, _wie_ ein Singleton unter PHP eigentlich umgesetzt wird bzw. ueberhaupt
umgesetzt werden kann.
Denn nach meinem Verstaendnis muss die Instanz ja - aus Gruenden des Designs der Sprache PHP - bei jedem Request
neu erstellt werden.

a) Somit kann doch eigentlich gar keine wirklicher Singleton realisiert werden?

b) Wie sieht es mit mehreren Benutzern aus? Teilen die sich tatsaechlich ein und dieselbe Instanz? Oder geschieht
das nur bei einem nahezu simultanen Zugriff?

Waere erfreut, wenn mir einer mal ein wenig Licht ins Dunkle bringen kann.
Besten Dank

Gruesse,
Thes

,
denn es existiert ja kein Container, in dem das Objekt

  1. hallo Thes,

    der oben von dir beschriebene Code ist alles, was man aus PHP zum Thema Singletons herausholen kann. Das Singleton gilt allerdings nur innerhalb des aktuellen Scripts. PHP ist sehr linear aufgebaut, das heißt, bei verschiedenen Requests wird jedes mal das Script neu geparst und ausgeführt. Ein Objekt ist also immer nur in dem aktuellen Script gültig. Dadurch dürfte sich auch die Benutzerrechtsfrage erledigen.

    Im Zusammenhang mit MySQL bietet PHP jedoch das feature der "persistenten Verbindungen", dass heißt eine Verbindung zum Server bleibt über mehrere Scripts hinweg bestehen. Mit verschiedenen Server-Konfigurationen kann das allerdings zu Problemen führen und ist daher im Allgemeinen nicht zu empfehlen.

    Was dir bleibt ist so etwas wie eine globale Konfiguration per Datenbank oder Dateizugriffen, die Singleton-Daten speichern und in den einzelnen Scripts wieder gelesen werden.

    Ansonsten wäre es für uns vielleicht hilfreich, den genauen Zweck des Singletons zu beschreiben, damit wir nähere Informationen bieten können.

    Weiter Infos zu Singleton-Klassen: http://php.net/Singleton

    Gruß,
    Niklas

    1. Hallo Niklas,

      danke fuer deine ausfuehrliche Antwort.

      der oben von dir beschriebene Code ist alles, was man aus
      PHP zum Thema Singletons herausholen kann.

      Das ist schade! Und irgendwie ein wenig ironisch. Denn diese Tatsache
      macht das Pattern ja eigentlich recht sinnfrei..

      Nun gut, wuensch noch einen schoenen Abend,
      Thes

      PS: Das gute daran ist jedoch, dass ich mich dann wohl nicht mit der
       Mehrbenutzer-Problematik beschaeftigen muss ;-)

      1. Moin!

        der oben von dir beschriebene Code ist alles, was man aus
        PHP zum Thema Singletons herausholen kann.
        Das ist schade! Und irgendwie ein wenig ironisch. Denn diese Tatsache
        macht das Pattern ja eigentlich recht sinnfrei..

        Warum dies denn? Singletons sind auch in PHP ziemlich sinnvoll, wenn es darum geht, Dinge auf genau eine Instanz zu beschränken. Die Kommunikation eines Skript mit der Datenbank beispielsweise sollte genau einen Kanal öffnen. Eine als Singleton ausgeführte Border-Class (wegen TDD - test-driven design) erlaubt z.B., pauschal allen Datenmanipulationsmethoden das Singleton als Parameter zu übergeben, ohne dass man sich um die eventuell vorher gelaufenen DB-Kontakte kümmern muß.

        PS: Das gute daran ist jedoch, dass ich mich dann wohl nicht mit der
        Mehrbenutzer-Problematik beschaeftigen muss ;-)

        Mehrbenutzer-Problematiken kommen ins Spiel, wenn Gleichzeitigkeiten relevant werden. Wird beim Programmieren gern vergessen, weil man in dem Skript ja "ganz allein" ist.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo Sven!

          Warum dies denn? Singletons sind auch in PHP ziemlich sinnvoll, wenn
          es darum geht, Dinge auf genau eine Instanz zu beschränken.

          Zugegeben, meine Antwort war reiner Reflex und entsprang meiner
          Enttaeuschung. Klar machen Singletons Sinn, da hst du natuerlich
          recht.

          Mehrbenutzer-Problematiken kommen ins Spiel, wenn Gleichzeitigkeiten
          relevant werden. Wird beim Programmieren gern vergessen, weil man in
          dem Skript ja "ganz allein" ist.

          Spaetestens wenn man einmal tagelang einen nicht reproduzierbaren
          Fehler gesucht hat und ihn schliesslich in einer Singleton-Klasse
          gefunden hat - ja, dann wird man es nicht mehr vergessen ;-)

          Gruesse,
          Thes

          1. Spaetestens wenn man einmal tagelang einen nicht reproduzierbaren
            Fehler gesucht hat und ihn schliesslich in einer Singleton-Klasse
            gefunden hat

            Das wird dir in PHP nicht passieren ;P

            Gruß,
            Niklas