Design Patterns in PHP - Teil 2: Das Singleton Pattern vererben

Wie wir schon im ersten Teil gesehen haben, kann das Singleton-Pattern recht simpel und schnell in php realisiert werden.

Nun sind wir Developer ja von Natur aus bequem und selbst wenn man copy&paste liebt, geht es einem irgendwann auf die Nerven, dass jede Klasse die das Singleton-Pattern nutzen soll immer wieder die identischen Codezeilen enthält.

Seit php5.3 und seinen neuen "late static bindings" ist es jedoch möglich, das Singleton-Pattern in einer einzigen Klasse zu definieren und alle Klassen können einfach dieses Pattern erben:

  1. <?php
  2. abstract class Singleton {
  3.     // Dieses Mal als "protected", 
  4.     // damit die Kindklassen
  5.     // einen eigenen Constructor 
  6.     // haben können
  7.     protected function __construct() {}
  8.  
  9.     // Das kennen wir schon
  10.     final private function __clone() {}
  11.  
  12.  
  13.     // Durch die Late static Bindings 
  14.     // ist es möglich, mittels des 
  15.     // "static"-Keywords eine Instanz 
  16.     // der aufrufenden Klasse
  17.     // zurückzuliefern!
  18.     final static public function init() {
  19.         static $instance = null;
  20.         return $instance ?: $instance = new static;
  21.     }
  22. }
  23.  
  24. class ChildSingleton extends Singleton {
  25.  
  26.     // protected!! Sonst könnte man den
  27.     // Constructor "normal" aufrufen
  28.     protected function __construct() {
  29.         // Hier dann alles, was bei der Instanzierung
  30.         // der Childklasse zu tun ist
  31.     }
  32.  
  33. }
  34. ?>

Danach können wir die Klasse "ChildSingleton" wieder nur über ihre init-Methode instanzieren:

  1. <?php
  2. // FATAL ERROR!
  3. $a = new ChildSingleton();
  4. // Funktioniert:
  5. $a = ChildSingleton::init();
  6. $b = ChildSingleton::init();
  7. ?>

Testen wir mal, ob alles geht...

  1. <?php
  2. var_dump($a);
  3. var_dump($b);
  4. var_dump(($a === $b));
  5. ?>
  6.  
  7. object(ChildSingleton)#1 (0) { }
  8. object(ChildSingleton)#1 (0) { }
  9. bool(true)

Neuen Kommentar schreiben

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.