Datenbank-Klasse, Singleton-Pattern richtig angewendet?
Fred
- php
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
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

--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
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
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!
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
[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
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. ;)
[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