Erweiterung Singleton in PHP
Arbeite ich in einer web-app-framework, und ein Teil davon besteht aus einer Reihe von Dienstleistungen, die alle implementiert als Singleton. Sie alle erweitern die Service-Klasse, wo die singleton-Verhalten implementiert wird, suchen so etwas wie dieses:
class Service {
protected static $instance;
public function Service() {
if (isset(self::$instance)) {
throw new Exception('Please use Service::getInstance.');
}
}
public static function &getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
Nun, wenn ich eine Klasse namens FileService umgesetzt wie diese:
class FileService extends Service {
//Lots of neat stuff in here
}
... der Aufruf der FileService::getInstance() wird nicht die Ausbeute eines FileService Beispiel, wie ich es mir vorstelle, aber ein Service-Instanz. Ich nehme an, das problem hier ist das "selbst" - Schlüsselwort in der Service-Konstruktor.
Gibt es eine andere Möglichkeit das zu erreichen, was ich hier will? Der singleton-code nur ein paar Zeilen, aber ich möchte trotzdem zu vermeiden, dass jede code-Redundanz, Wann immer ich kann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Code:
Wenn du PHP < 5.3, fügen Sie diese zu:
get_called_class
, Hinzugefügt in PHP 5.3. Dies zu tun, in früheren Versionen ist einen Tick schwieriger.getInstance
ein Dutzend mal, das ist ein Dutzend öffnet, und ein Dutzend liest der Klasse Datei.Hatte ich mehr Aufmerksamkeit in 5.3 Klasse, ich hätte gewusst, wie man dieses Problem lösen mich. Mit der neuen late-static-binding-Funktion von PHP 5.3, ich glaube, Coronatus' proposition kann vereinfacht werden, in diesem:
Ich es ausprobiert, und es funktioniert wie ein Charme. Pre 5.3 ist noch eine ganz andere Geschichte, aber.
$instance
für alle Unterklassen, also nur die singleton-Instanz der Klasse, wogetInstance()
ersten mal aufgerufen wird, wird zurückgegeben.Dieser behoben wird, Johan Antwort. PHP 5.3+
Habe ich eine gute Lösung gefunden.
Folgendes ist mein code
Finden Sie http://php.net/manual/en/language.oop5.late-static-bindings.php
für mehr info