PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Das Singleton Design Pattern mit PHP 4

Ein vielversprechendes Standardmuster ist das Singleton Design Pattern. Es sorgt dafür, das in einer Applikation oder einem Framework immer nur ein und dieselbe Objektinstanz verwendet wird - das aber, so oft man möchte. Eine klassische Verwendung wäre etwa eine Datenbankverbindung. Es wird immer nur eine gleichzeitig benötigt, aber an mehreren Stellen.

Ein Vorteil, der sich auf den 1. Blick ergibt, ist die Performance: Das Objekt muss nur einmal initialisiert werden - eventuelle Datenbankverbindungen werden nur einmal zu Beginn aufgebaut. Auch eine unter Umständen aufwändige Parametrisierung muss nur einmal durchgeführt werden. Und zu guterletzt wird der RAM nicht mit redundaten Infos zugemüllt - was will man mehr als eine schlanke, effiziente Anwendung!?

Um ein stinknormales Objekt zu einem Singleton-Objekt zu machen, ist nur eine einzige Funktion notwendig: “GetInstance”. Wie sie heisst, ist eigentlich egal - als Quasistandard hat sich aber “GetInstance” durchgesetzt. Beim 1. Aufruf erzeugt diese statische Funktion ein neues Objekt und liefert eine Referenz auf dieses zurück.

Werfen wir mal einen Blick auf die Implementierung:

class SingletonKlasse
{
    function &GetInstance()
    {
        static $obj= null;

        if(!is_object($obj))
            $obj= new SingletonKlasse();

        return $obj;
    }
}

Das kaufmännische & bestimmt, das der Rückgabewert eine Referenz auf das erzeugte Objekt ist. Um eine Instanz des Objektes abzurufen, schlage ich folgendes vor:

$singletonObjekt=& SingletonKlasse::GetInstance();

Damit die Referenzzuweisung beibehalten wird ist es wichtig, das =& als Zuweisungsoperator zu verwenden. Klingt komisch und doppeltgemoppelt, aber da ist PHP 4 halt ein bisschen pinibel. Wenn mans weglässt, wird die Referenz in eine Objektkopie umgewandelt und ist nicht mehr mit dem Ursprungsobjekt gekoppelt.

Da die eigentliche Objektinstanz in einer statischen Funktionsvariable vorgehalten wird, wird bei jedem Abruf des Objektes eine Referenz auf das immerselbe Objekt zurückgeliefert.

  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

Ford Fairlane meint dazu:

3. Juli 2007 um 01:24

PHP5 verwendet heutzutage immer Referenzen, daher ist das kfm. & überflüssig. Das ist aber kein echtes Problem. Ein Problem ist hingegen, daß der gezeigte Code nicht verhindert, daß ein Entwickler versehentlich oder gar absichtlich mittels new ein zweites Objekt erzeugt oder das bestehende mit clone kopiert. Dies muß unter allen Umständen verhindert werden — das ist ja der Sinn dieses Patterns.

Das Singleton-Pattern wird nicht nur aus Performancegründen verwendet, sondern auch um zuzusichern, daß nur eine einzige Instanz dieser Klasse existiert. Das ist beispielsweise sinnvoll, um Operationen über mehrere Subsysteme zu koordinieren. Diese Zusicherungen sind nicht mehr sicher, wenn mittels new oder clone mehrere Instanzen derselben Klasse erzeugt werden können.

class SingletonKlasse {
private static $instance = null;
public function singleton() {
if(self::$instance == null) {
self::$instance = new self();
}
}
public function getInstance() {
return self::singleton();
}
protected function __construct() {}
private function __clone() {}
}

timi meint dazu:

3. Juli 2007 um 08:49

Danke für die korrekte und super ausführliche Ergänzung!

Mauz meint dazu:

23. April 2008 um 18:49

haha..Lord Fairlane mault da was wegen php5 vor, obwohl es um php4 geht. Mal wieder voll das Thema verfehlt.

timi meint dazu:

24. April 2008 um 13:39

;)

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung