Websiteentwicklung: PHP: Muster Singleton
Singleton
BearbeitenErzeugt genau eine Instanz eines Objektes. (vgl. WikiBook Muster)
Es wird empfohlen sich das Benutzen eines Singletons genau zu überlegen, da es einige Nachteile mit sich bringen kann. Als Beispiel ist hier die feste Kopplung zu nennen, die ein Testen der Klasse aufwendiger macht. Sollte man dieselbe Instanz einer Klasse in mehreren anderen Klassen brauchen, empfiehlt es sich Dependency Injection zu benutzen, da durch diese Methode der Code um einiges flexibler wird als mit einem Singleton.
Implementierung
Bearbeiten <?php
class Singleton {
/**
* instance
*
* Statische Variable, um die aktuelle (einzige!) Instanz dieser Klasse zu halten
*
* @var Singleton
*/
protected static $_instance = null;
/**
* get instance
*
* Falls die einzige Instanz noch nicht existiert, erstelle sie
* Gebe die einzige Instanz dann zurück
*
* @return Singleton
*/
public static function getInstance()
{
if (null === self::$_instance)
{
self::$_instance = new self;
}
return self::$_instance;
}
/**
* clone
*
* Kopieren der Instanz von aussen ebenfalls verbieten
*/
protected function __clone() {}
/**
* constructor
*
* externe Instanzierung verbieten
*/
protected function __construct() {}
}
?>
Beispiel
BearbeitenDas folgende Beispiel soll verdeutlichen, wie die oben beschriebene Implementierung verwendet wird.
<?php
class Demo {
/**
* instance
*
* Statische Variable, um die aktuelle (einzige!) Instanz dieser Klasse zu halten
*
* @var Singleton
*/
protected static $_instance = null;
public $value = 1;
/**
* get instance
*
* Falls die einzige Instanz noch nicht existiert, erstelle sie
* Gebe die einzige Instanz dann zurück
*
* @return Singleton
*/
public static function getInstance()
{
if (null === self::$_instance)
{
self::$_instance = new self;
}
return self::$_instance;
}
/**
* clone
*
* Kopieren der Instanz von aussen ebenfalls verbieten
*/
protected function __clone() {}
/**
* constructor
*
* externe Instanzierung verbieten
*/
protected function __construct() {}
}
$demo1 = Demo::getInstance();
$demo1->value = 5;
echo '$demo1: $value = '.$demo1->value.'<br />';
$demo2 = Demo::getInstance();
echo '$demo2: $value = '.$demo2->value;
?>
Ausgabe
$demo1: $value = 5 $demo2: $value = 5
Weblinks
Bearbeiten- Das Singleton, richtig implementiert (deutsch)