Fred: Datenbank-Klasse, Singleton-Pattern richtig angewendet?

Hey.

Ich schreibe an einer PostgreSQL Datenbank-klasse in PHP.
Ich würde gerne das Singletonpattern für die Datenbankverbinung verwenden.
Können mir ein paar Hasen unter euch sagen ob ich das richtig mache? Hat jemand eine performantere Methode im Kopf?

private static $_db_connection;  
  
public static function _getConnection(){		if(!self::$_db_connection=pg_connect("host=".$host." port=5432 dbname=".$name." user=".$user." password=".$pw])){  
echo "Verbindung fehlgeschlagen!".pg_last_error();  
}  
return self::$_db_connection;  
}

Gruß Fred

  1. Hello,

    Ich schreibe an einer PostgreSQL Datenbank-klasse in PHP.
    Ich würde gerne das Singletonpattern für die Datenbankverbinung verwenden.
    Können mir ein paar Hasen unter euch sagen ob ich das richtig mache? Hat jemand eine performantere Methode im Kopf?

    private static $_db_connection;

    public static function _getConnection(){ if(!self::$_db_connection=pg_connect("host=".$host." port=5432 dbname=".$name." user=".$user." password=".$pw])){
    echo "Verbindung fehlgeschlagen!".pg_last_error();
    }
    return self::$_db_connection;
    }

      
    Das ist aber kein Singleton, was Du da gebastelt hast.  
      
    Der Sinn eines Singletons ist, dass es nur eine einzige Instanz der Klasse gibt. Um dies zu erreichen, muss der Objektressource-Identifier statisch gespeichert werden.  
      
    Wenn beim Instantiierungsversuch dann festgestellt wird, dass schon ein gültiger Identifier besteht (also einer <> NULL), dann wird dieser als Ergebnis zurückgeliefert. Anderenfalls muss der Konstruktor der Klasse aufgerufen werden und dann der neu erzeugte Identifier sowohl statisch gespeichert als auch zurückgeliefert werden.  
      
    Der eigentliche Konstruktor der Klasse darf nicht erreichbar sein. Dafür gibt es dann die statische Instatiierungsfunktion. Die muss selbstverständlich public sein.  
      
    <http://www.phpbar.de/w/Singleton>  
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
    Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>  
      
    
    
  2. Hallo Fred,

    Ich würde gerne das Singletonpattern für die Datenbankverbinung verwenden.
    Können mir ein paar Hasen unter euch sagen ob ich das richtig mache?

    ich bin zwar kein Hase, aber für mich sieht es fehlerhaft aus.

    Hat jemand eine performantere Methode im Kopf?

    Was verstehst Du unter "performantere Methode"? Ich kann mir darunter wenig vorstellen.

    // Wo ist die Initialisierung Deiner privaten Eigenschaft?
    private static $_db_connection;

    public static function _getConnection(){

    // Warum versuchst Du jedes mal eine Verbindung aufzubauen.
    // statt die bestehende Verbindung zu nutzen?
    if(!self::$_db_connection=pg_connect("host=".$host." port=5432 dbname=".$name." user=".$user." password=".$pw])){

    // Warum gibst Du etwas aus?
    // Wen interessiert das? Wen sollte es überhaupt nicht interessieren?

    echo "Verbindung fehlgeschlagen!".pg_last_error();
    }
    return self::$_db_connection;
    }

      
    Schau Dir doch dedlfix' Beispiele für einen lazy connect an, ich hab' Dir zwei (von vielen) verlinkt:  
      
    - </archiv/2009/9/t190790/#m1271894>  
    - </archiv/2008/2/t166741/#m1087729>  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hi!

      Schau Dir doch dedlfix' Beispiele für einen lazy connect an, ich hab' Dir zwei (von vielen) verlinkt:

      • </archiv/2009/9/t190790/#m1271894>
      • </archiv/2008/2/t166741/#m1087729>

      Das sind aber nur normale Singletons, kein Lazy Connect. Letzteres würde bedeuten, dass zwar beispielsweise über das Singleton-Pattern eine Instanz zurückgegeben wird, diese jedoch den Datenbank-Connect noch nicht vollzogen hat. Erst wenn eine Methode davon aufgerufen wird, die wirklich eine Verbindung braucht, wird diese selbständig intern aufgebaut. Lazy heißt, der Code ist faul und "prokrastiniert" bis zum letztmöglichen Zeitpunkt.

      Lo!

      1. Hello,

        Lazy heißt, der Code ist faul und "prokrastiniert" bis zum letztmöglichen Zeitpunkt.

        Mensch Dedlfix, wie Du mit die Fremdwörters umgehen kannst, das ist richtig euphonisch. :-))

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. [latex]Mae  govannen![/latex]

        Lazy heißt, der Code ist faul und "prokrastiniert" bis zum letztmöglichen Zeitpunkt.

        grr, wenn ich den erwische, der *mich* programmiert hat...

        Cü,

        Kai

        --
        A workaround for an avoidable problem often adds clutter and overhead to the program which
        could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
        1. Tach.

          Lazy heißt, der Code ist faul und "prokrastiniert" bis zum letztmöglichen Zeitpunkt.

          grr, wenn ich den erwische, der *mich* programmiert hat...

          Ach komm. Dem eine einzuschenken, würdest Du doch auch erst ewig und drei Tage vor Dir her schieben. ;)

          --
          Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.
          1. [latex]Mae  govannen![/latex]

            Lazy heißt, der Code ist faul und "prokrastiniert" bis zum letztmöglichen Zeitpunkt.

            grr, wenn ich den erwische, der *mich* programmiert hat...

            Ach komm. Dem eine einzuschenken, würdest Du doch auch erst ewig und drei Tage vor Dir her schieben. ;)

            *g*
            Erwischt.

            Cü,

            Kai

            --
            A workaround for an avoidable problem often adds clutter and overhead to the program which
            could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
            Foren-Stylesheet Site Selfzeug JS-Lookup
            SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?