Jens A. Koch

Giving Singleton’s a shot

Instanzierung eines Singletons mittels des “Klassennamen”. Der Klassenname repräsentiert das aktuelle Objekt.

/**
* @return This object is a singleton.
*/
final static public function getInstance()
{
return Klassenname::$instance=(is_null(Klassenname::$instance))?new Klassenname:null;
}

Instanzierung eines Singletons mittels “self”. Self repräsentiert das aktuelle Objekt.

/**
* @return This object is a singleton.
*/
final static public function getInstance()
{
return self::$instance=(is_null(self::$instance))?new self:null;
}

Instanzierung eines Singletons mittels “static”. Static repräsentiert das aktuelle, zur Laufzeit statisch gebundene Objekt (late static binding).

final static public function getInstance()
{
static $instance = null;

return $instance ?: $instance = new static;
}

Instanzierung eines Singletons mittels magisches Laufzeitkonstante “__CLASS__”. PHP5+

public static function getInstance()
{
if (!isset(self::$instance))
{
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}

Singletons considered harmful?

Und noch etwas Prototype-Magic hinten dran:

public function getInstance()
{
if ($this->_prototype === null)
{
$this->_prototype = unserialize(sprintf(‘O:%d:”%s”:0:{}’, strlen($this->name), $this->name));
}
return clone $this->_prototype;
}

Hier wird eine Prototype Klasse instanziert.
Und zwar auf folgendem Weg: mittels sprintf() wird ein String zusammengesetzt, der den Klassennamen und seine Länge enthalt.
Durch Unserialisierung und anschließendes Clonen entsteht
eine leere, aber benannte Klasse. Diese kann nun befüllt werden kann.
Dieser Trick kann eingesetzt werden, um Objekteigenschaften einzufrieren und wieder aufzutauen.

Comments Off on Giving Singleton’s a shot

Comments are closed.