Singletons are glorified global variables. 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 Übung, aber sie existieren, wenn Sie sie verwenden müssen.
Es gibt jedoch ein paar Gründe, warum Sie ein Singleton in PHP möchten.
Singletons sind nützlich, wenn der Aufruf an getInstance
(der kanonische Name für die Methode, die die einzelne Instanz des Singleton zurückgibt) an irgendeinem Punkt im Skript vorgenommen werden konnte. 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.
Datenbankobjekte in der Regel werden sehr früh in der Anfrage Lebensdauer erstellt, so dass bestimmte Vorteile von Singleton-Ness verschwendet werden würde.
Es gibt andere Alternativen zu Singleton, die die Arbeit auf andere Weise erledigen können. Ein Beispiel ist dependency injection, ein phantastischer Begriff für das Übergeben externer Objekte, von denen ein neues Objekt (zum Beispiel ein Datenbank-Handle) an das Objekt zur Konstruktionszeit abhängen würde. Dies kann jedoch kompliziert oder ärgerlich sein. Wenn Sie es richtig machen, können Sie jedes Mal ein Los derselben Objekte injizieren.
Eine andere Alternative ist die Registry pattern, die effektiv ein Container für Dinge ist, die sonst global sein würden. Wenn Sie globale Variablen nicht mögen, aber nichts dagegen haben, dass sie effektiv Namespaced sind, wäre dies eine Lösung, die Sie möchten.
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.
Wenn Sie einige Cache verwenden, kann es die Datenbankverbindung vorkommen, dass nicht erforderlich ist. Da das Singleton in einer Klasse verwendet wird, ist es auch möglich, das Autoload zu verwenden. Ich glaube nicht, dass Singleton schlecht für die Datenbankverarbeitung in PHP ist. – Savageman
Sehr wahr. Wenn Sie zwischen Ihrem Code und Ihrer Datenbank eine umfassende Caching-Ebene haben, ist es sehr wahrscheinlich, dass Sie möglicherweise nicht einmal eine Verbindung mindestens zeitweise öffnen müssen. – Charles
Der Punkt über das Testen ist sehr gültig. Das Hauptproblem mit Singleton besteht darin, dass es nicht nur auf eine einzelne Instanz beschränkt ist (wie wäre es mit zwei separaten db-Verbindungen, um dbs zu trennen), sondern auch auf eine bestimmte Implementierung. Wenn Sie testen möchten, müssen Sie Ihre DB-Verbindung durch etwas anderes ersetzen. Abstraktion wird schwieriger, weil es nicht möglich ist, dein Singleton zu verlängern. Die Registrierung behebt viele dieser Probleme. – igorw