Singleton mit PHP 5
Singleton ist ein sog. Design Pattern, zu Deutsch Entwurfsmuster. Einfach gesagt, sind es Standardlösungen für bestimmte Problemstellungen innerhalb der objektorientierten Programmierung, die immer wieder auftreten.
Eines der einfachsten Muster ist das Singleton. Es stellt sicher, dass von einer Klasse nur eine Instanz erzeugt werden kann und keine weitere. Bei bestimmten Objekten, z.B. für die Datenbank-Verbindung, kann das sehr hilfreich sein. Da ein Singleton über eine statische Methode aufgerufen wird, ist es außerdem möglich dieselbe Instanz einer Klasse ohne Probleme überall im Script aufrufen zu können – widerrum sehr nützlich bei Datenbanken.
So sieht in Singleton in PHP 5 aus:
<?php
class Demo {
/**
* @access private
* @static
* @var object
*/
private static $_instance = null;
/**
* Singleton
*
* @access public
* @static
* @return object self::$Instance
*/
public final static function getInstance() {
if(!self::$_instance instanceof Demo) {
self::$_instance = new Demo();
}
return self::$_instance;
}
/**
* Constructor
*
* @access private
*/
private function __construct() {
// Code
}
/**
* No Clone Wars
*
* @final
* @access private
*/
public final function __clone() {
return null;
}
}
?>
Zuerst wird das statische Attribut $instance als null definiert, gefolgt von der statischen Methode getInstance(). Die überprüft, ob in self::$instance bereits eine Instanz der Klasse hinterlegt ist. Falls nein, wird ein neues Objekt erstellt und die Referenz in self::$instance gespeichert. Anschließend gibt getInstance() die Instanz der Klasse zurück.
Wichtig ist, dass der Konstruktor der Klasse als private definiert ist. Somit ist sichergestellt, dass nur getInstance() ihn aufrufen kann und man keine weiteres Objekt der Klasse erzeugen darf. Ebenso muss die Methode __clone() als private deklariert werden, damit das Objekt nicht kopiert werden darf.
Mit folgendem Code erhält man nun die Instanz der Klasse:
$demo = Demo::getInstance();
Dieser Aufruf funktioniert überall, sobald die entsprechende Klasse eingebunden wurde.
Das Singleton Pattern ist aus diversen Gründen recht umstritten. Viele sind der Ansicht, dass man es gar nicht bräuchte. Das mag vielleicht in der normalen Anwendungsentwicklung zutreffen, aber für Web-Programmierung mit PHP, ist es insbesondere bei Datenbank-Verbindungen sinnvoll. Gerade Anfänger begehen oft in dieser Hinsicht, da die alte MySQL-Schnittstelle verwendet und auf die Verwaltung der einzelnen Verbindungen zum Datenbank-Server gepfiffen wird. Eine DB-Klasse mit Singleton stellt sicher, dass es nur eine Verbindung gibt und das entsprechende Objekt überall verfügbar ist.
Hinweis: aufgrund der mangelhaften Objekt-Unterstützung in PHP 4, ist ein Singleton dort – in der oben gezeigten. Form – nicht möglich.