Websiteentwicklung: PHP: Muster Singleton

Aus Wikibooks


Singleton[Bearbeiten]

Erzeugt 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[Bearbeiten]

Das 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]