Singleton PHP - Datenbank-Handler

8

Ich habe in letzter Zeit etwas über das Singleton-Muster gelesen. Wenn es die technischen Aspekte davon liest, scheint es ideal geeignet zu sein, um einen Datenbank-Handler oder dergleichen zu verwalten. Aber nach dem Lesen größerer Ressourcen scheint es, dass die Entwicklergemeinschaft das Muster wirklich nicht favorisiert.

Ich habe Mühe, eine bessere Lösung für ein solches Problem zu finden - d. h. nur ein einzelner Handler kann gleichzeitig initialisiert werden - warum ist das Muster also so schlecht? Wird es überstrapaziert oder ist es nur grundlegend fehlerhaft?

PHP ist die Sprache, die ich benutze.

    
Bill 18.07.2010, 21:21
quelle

6 Antworten

8

Singletons sind glorifizierte globale Variablen . Das Entwurfsmuster wurde für Sprachen erstellt, in denen globale Variablen schwierig oder unmöglich sind oder wo sie als schlechte Praxis angesehen werden. (Tatsächlich sind die meisten gängigen Entwurfsmuster für restriktive Sprachen ausgelegt. Eine große Anzahl von ihnen ist in anderen Sprachen einfach unnötig.)

PHP hat globale Variablen. PHP globale Variablen sind in der Regel eine schlechte Praxis, aber sie existieren, wenn Sie sie brauchen.

Es gibt jedoch ein paar Gründe, warum Sie ein Singleton in PHP möchten.

Singletons sind nützlich, wenn der Aufruf von getInstance (der kanonische Name für die Methode, die die einzelne Instanz des Singleton zurückgibt) zu irgendeinem Zeitpunkt im Skript erfolgen kann. Bis zu diesem Punkt muss das Objekt nicht existieren. Wenn das Objekt stattdessen eine globale Variable wäre, müsste es entweder bereits existieren oder der Code, der versucht, auf das Objekt zu verweisen, müsste es zuerst instanziieren. In der Tat, überall wo es verwendet werden könnte, müsste es korrekt instanziiert werden. Durch die Zentralisierung der Erstellung des einzelnen Objekts in getInstance vermeiden Sie jedes Mal, wenn Sie das Objekt referenzieren müssen, das Kopieren und Einfügen von Textbausteinen.

Datenbankobjekte in der Regel werden sehr früh in der Anforderungslebensdauer erstellt, so dass der spezifische Vorteil der Singleton-Funktion verschwendet wird.

Es gibt andere Alternativen zu Singleton, die die Arbeit auf andere Weise erledigen können. Ein Beispiel ist Dependency Injection , ein phantastischer Ausdruck für die Übergabe externer Objekte, von denen ein neues Objekt abhängen würde (wie zum Beispiel ein Datenbank-Handle) ) zum Objekt zur Konstruktionszeit. Dies kann jedoch kompliziert oder ärgerlich sein. Wenn Sie es richtig machen, können Sie jedes Mal ein Los derselben Objekte einfügen.

Eine andere Alternative ist das Registrierungsmuster , das eigentlich ein Container für Dinge ist, die sonst Globals wären. Wenn Sie globale Variablen nicht mögen, aber nichts dagegen haben, dass sie effektiv Namespaced sind, wäre dies eine Lösung, die Sie gerne hätten.

Am Ende, wählen Sie einen Weg, um es zu tun, und bleiben Sie mit dieser einen Weg in Ihrer Codebasis. Persönlich bin ich ein Fan des Datenbankobjekts, das global ist.

    
Charles 18.07.2010 21:34
quelle
2

Einige Leute folgen diesem Mantra, dass Singletons böse sind, weil sie wie globale Variablen sind und Ihren Code schwieriger und schwieriger zu testen machen.

Ich für meinen Teil denke nicht, dass es so eine schlechte Idee ist, und ich denke, dass ein Singleton ziemlich gut für einen Datenbank-Handler funktioniert. Es ist einfach, intuitiv und Sie haben mehr Kontrolle über eine Singleton-Instanz als über eine globale Variable.

    
quantumSoup 18.07.2010 21:25
quelle
0

Es ist nichts falsch mit dem Singleton-Muster, ich benutze es die ganze Zeit.

Wie Sie sagen, ist es ideal für Ressourcen, für die Sie nur eine Instanz haben sollten und die für die Anwendung global sind.

Ich denke, einige Entwickler mögen es nicht wegen der Abhängigkeiten, die durch diese Methode erzeugt werden können. Lies etwas über Dependency Injection, da ich denke, es deckt ab, warum Singletons schlecht sind, aber ich kann mich nicht genau erinnern.

    
Stephen Melrose 18.07.2010 21:35
quelle
0

Ich verwende einen Singleton-Datenbank-Handler für die meisten meiner kleineren Web-Apps. Wenn es mit einer externen Konfigurationsdatei und PDO als Methode des Datenbankzugriffs gekoppelt ist, kann es immer noch sehr flexibel von Projekt zu Projekt verschoben werden, solange die Methoden nicht anwendungsmodellspezifisch sind (zB getRow oder getAll anstelle von getThing oder getBreakfast) . Ich versuche nur, sicherzustellen, dass alle meine Zugriffskonstanten separat definiert sind.

Ein großer Teil des Leids für Singletons stammt hauptsächlich aus Sprachen, die komplexer sind als PHP.

    
DeaconDesperado 18.07.2010 21:41
quelle
0

Abgesehen von der globalen variablen Sache mag die Gemeinschaft Singletons nicht, weil schließlich die Chance besteht, dass du eine zusätzliche Instanz der Klasse brauchst. Zum Beispiel können Sie ein Singleton für Ihre Datenbankverbindung verwenden und es funktioniert großartig bis zu dem Moment, wenn Sie wie einmal mit 2 Datenbanken verbinden möchten. An diesem Punkt refaktorieren Sie entweder Ihre gesamte App oder Sie kopieren den Singleton in eine neue Klasse und verwenden diesen. Wie auch immer, du bist auf einem bestimmten Bach ohne Paddel.

Das Singleton-Muster ist jedoch ein Entwurfsmuster, keine Implementierung. Niemand hat gesagt, dass der Code, der Sie auf eine Instanz beschränkt, innerhalb der Klasse sein muss. Ich habe festgestellt, dass Sie die Singleton-Implementierung in die Factory-Methode einfügen können, wenn Sie die Klasse über eine Factory-Methode instanziieren. Wenn Sie eines Tages eine neue Instanz benötigen, können Sie eine neue Factory-Methode hinzufügen, da die Klasse selbst keine Einschränkungen hat. Der Preis dafür ist natürlich, dass Sie Ihren Singleton immer über eine Fabrik instanziieren und nicht direkt.

    
Manos Dilaverakis 19.07.2010 11:46
quelle
0

DALMP (http://code.google.com/p/dalmp/)

verwendet ein Singleton und kann gleichzeitig mit mehr als zwei Datenbanken verbunden werden

    
tareco 27.04.2011 16:51
quelle

Tags und Links