Singleton Pattern

  • warning: array_fill(): Number of elements must be positive in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: implode(): Invalid arguments passed in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
  • user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 query: SELECT p.perm FROM role r INNER JOIN permission p ON p.rid = r.rid WHERE r.rid IN () in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
Your rating: None Average: 5 (1 vote)

Mit Hilfe des Singleton Patterns ist es möglich ein Klasse so umzuschreiben, dass diese nur einmalig instanziiert werden kann. Die Erzeugung der Instanz erfolgt dabei nicht über nen Operator new sondern durch eine statische Methode - in den meisten Fällen getInstance().

Aber nun zu einem Beispiel.

  1. <?php
  2. class Foo {
  3.  
  4. private static $_instance = null;
  5.  
  6. public static function getInstance() {
  7. if (is_null(self::$_instance)) {
  8. self::$_instance = new Foo();
  9. }
  10. return self::$_instance;
  11. }
  12.  
  13. private function __construct();
  14.  
  15. private function __clone();
  16. }

Eine kurze Erklärung zum Beispiel: Die statische Methode getInstance() prüft ob in der statischen Eigenschaft $_instance der Wert null überschrieben wurde. Sollte dies nicht der Fall sein, wird eine Instanz von sich selbst an dieser Stelle abgelegt und anschließend zurück gegeben.

Da der Inhalt der statischen Eigenschaft einen den kompletten Request erhalten bleibt, wäre dieser an einer anderen Stelle im Script bereits mit dem Objekt belegt. Sollte auch dort getInstance() ausgeführt werden, erhält man das bereits abelegte Objekt.

  1. <?php
  2.  
  3. $obj = Foo::getInstance();
  4. ...
  5. $obj2 = Foo::getInstance(); // gibt das gleiche Objekt zurück

Die Methoden

  1. private function __construct();
  2.  
  3. private function __clone();

sind privat um zu unterbinden, dass über die Operationen new oder clone weitere Instanzen erzeugt werden können.

Tags