Ich weiß, dass dies alt ist, aber Dr8ks Antwort war fast da.
Wenn Sie überlegen, einen Code zu schreiben, gehen Sie davon aus, dass sich dieser ändern wird. Das bedeutet nicht, dass Sie davon ausgehen, welche Art von Änderungen irgendwann in der Zukunft vorgenommen werden, sondern dass irgendeine Form von Änderung vorgenommen wird.
Machen Sie es zu einem Ziel, das den Schmerz lindert, Änderungen in der Zukunft vorzunehmen: Ein globales Unternehmen ist gefährlich, weil es schwierig ist, es an einem einzigen Ort zu verwalten. Was ist, wenn ich diesen Datenbankverbindungskontext in Zukunft bewusst machen möchte? Was ist, wenn ich möchte, dass es sich jedes Mal, wenn es verwendet wurde, schließt und wieder öffnet? Was ist, wenn ich im Interesse der Skalierung meiner App einen Pool von 10 Verbindungen verwenden möchte? Oder eine konfigurierbare Anzahl von Verbindungen?
Eine Singleton-Fabrik bietet Ihnen diese Flexibilität. Ich habe es mit sehr wenig zusätzlicher Komplexität eingerichtet und erhalte mehr als nur Zugriff auf dieselbe Verbindung. Ich kann auf einfache Weise ändern, wie diese Verbindung später an mich weitergegeben wird.
Beachten Sie, dass ich Singleton Factory im Gegensatz zu einfach Singleton sage . Es gibt kaum einen Unterschied zwischen einem Singleton und einem globalen. Aus diesem Grund gibt es keinen Grund für eine Singleton-Verbindung: Warum sollten Sie die Zeit damit verbringen, diese einzurichten, wenn Sie stattdessen eine reguläre globale Verbindung erstellen könnten?
Was eine Fabrik Ihnen bringt, ist ein Grund, warum Sie Verbindungen erhalten, und ein separater Ort, an dem Sie entscheiden können, welche Verbindungen (oder Verbindungen) Sie erhalten.
Beispiel
class ConnectionFactory
{
private static $factory;
private $db;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}
public function getConnection() {
if (!$this->db)
$this->db = new PDO(...);
return $this->db;
}
}
function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}
Dann, in 6 Monaten, wenn Ihre App sehr berühmt ist und durcheinander und mit einem Schrägstrich versehen wird und Sie entscheiden, dass Sie mehr als eine einzige Verbindung benötigen, müssen Sie nur ein Pooling in der Methode getConnection () implementieren. Wenn Sie sich für einen Wrapper entscheiden, der die SQL-Protokollierung implementiert, können Sie eine PDO-Unterklasse übergeben. Oder wenn Sie bei jedem Aufruf eine neue Verbindung wünschen, können Sie dies tun. Es ist flexibel statt starr.
16 Codezeilen, einschließlich geschweifter Klammern, ersparen Ihnen Stunden und Stunden und Stunden des Refactorings für etwas Unheimliches auf der ganzen Linie.
Beachten Sie, dass ich dieses "Feature Creep" nicht berücksichtige, da ich in der ersten Runde keine Feature-Implementierung durchführe. Es ist die Grenzlinie "Future Creep", aber irgendwann ist die Idee, dass "Codierung für morgen heute" immer eine schlechte Sache ist, für mich nicht lebendig.