Das Registry-Pattern in PHP 5 (OOP)

Ein Pattern, das man sehr häufig antrifft, ist neben dem Singleton die sogenannte Registry. Eine Registry ist streng gesehen nur eine Verschiebung des globalen Gültigkeitsbereiches.

Zugriff von überall
Durch eine Registry kann man von überall auf die in der Registry ablegten Variablen / Objekte zugreifen. Dazu wird diese meistens als Singleton implementiert. Das heißt, man muss die Instanz nicht ständig durch die verschiedenen Schichten reichen, sondern kommt überall bequem per Registry::getInstance() dran.

Zur Erklärung ein bisschen Code
(Diese Klasse kommt aus meinem Framework. Es werden die Interzeptormethoden (auch magische Methoden genannt) verwendet.)

< ?php
/**
 * @autor Simon H.
 * @version 0.1
 * @package MVC-Framework
 *
 * FW_Registry ist eine Singleton-Klasse, die in der Lage ist, Variablen, Objekte, usw.
 * an jeder Stelle im Framework zugänglich zu machen
 *
 * Sollte trotzdem eher als Notlösung angesehen werden.
 */
class FW_Registry
{
  /**
   * @var array $data
   * @access protected
   *
   * Hier werden die Daten abgelegt.
   * Kann nur über __get, __set und __unset manipuliert werden
   */
  protected $___data;

  /**
   * @var FW_Registry $instance
   * @access private static
   *
   * Speichert die einige Instanz dieser Klasse (Singleton)
   */
  private static $instance = null;

  /**
   * @access public static
   * @return FW_Registry
   *
   * Eine Art Ersatzkonstruktor (Singleton)
   */
  public static function getInstance()
  {
    if(self::$instance === null)
    {
      self::$instance = new self();
    }
    return self::$instance;
  }

  /**
   * @access private
   * Konstruktor privat, wegen Singleton
   */
  private function __construct() {}

  /**
   * @access private
   * Kopierkosntrutkor ist auch privat, weil nur 1 Objekt erlaubt ist
   */
  private function __clone() {}

  /**
   * @access public
   * @param string $key
   * @param mixed  $value
   *
   * Einen neuen Wert der Registry hinzufügen
   */
  public function __set($key, $value)
  {
    $this->___data[$key] = $value;
  }

  /**
   * @access public
   * @param string $key
   * @return mixed|null
   *
   * Einen Wert aus der Registry anhand von $key lesen
   * Liefert null, wenn der Wert nicht existiert
   */
  public function __get($key)
  {
    if(isset($this->___data[$key]))
    {
      return $this->___data[$key];
    }
    else
    {
      return null;
    }
  }

  /**
   * @access public
   * @param string key
   * @return bool
   *
   * Prüft, ob ein $key vorhanden ist
   */
  public function __isset($key)
  {
    return isset($this->___data[$key]);
  }

  /**
   * @access public
   * @param string key
   *
   * Einen Wert aus der Registry löschen
   */
  public function __unset($key)
  {
    unset($this->___data[$key]);
  }
}
?>

Es gibt in der Klasse die üblichen Singletonkomponenten. Außerdem eine geschützte (protected) Eigenschaft $___data. Sie ist protected, weil es oft mehrere Registries für bestimmte Aufgaben gibt.
So kann man einfach eine neue Registry anlegen, indem man von FW_Registry erbt.

Erklärung
Der Code sollte eigentlich selbsterklärend sein. Trotzdem folgt hier noch eine kurze Erklärung aller Methoden:

  • getInstance(): Singleton-„Konstruktor“
  • __set($key, $value): Legt $value unter $key in FW_Registry::$___data ab
  • __get($key): Liefert den unter $key abgelegten Wert
  • __isset($key): Prüft, ob $key existiert
  • __unset($key): Löscht $key

Anwendung

$registry = FW_Registry::getInstance(); //Registry ist jetzt in $registry verfügbar
$registry->test = "Hallo";
echo $registry->test; //gibt Hallo aus
echo (int)isset($registry->test); //gibt 1 aus
unset($registry->test);
echo (int)isset($registry->test); //gibt 0 aus

Geht sparsam damit um!
Es sollte aber gesagt sein, dass die Registry nicht die Lösung für alle Probleme ist. Oftmals ist es besser, Objekte als Parameter an eine andere Klasse/Methode zu übergeben. Das sorgt für mehr Übersicht!

1 Star2 Stars3 Stars4 Stars5 Stars (1 Stimme, durchschnittlich 5,00 / 5)
Loading...


4 Kommentare zu “Das Registry-Pattern in PHP 5 (OOP)”

  1. […] […]

  2. […] Objekte zur Verfügung zu haben (also z.b. den Model- Controller), verwendet man z.B. eine Registry. Ansonsten kannst du Objekte auch direkt übergeben: <?php class bla { function test (User […]

  3. Mhh.. Die StdClass tut es in den meisten fällen auch 😉

  4. Ist doch nicht so schön 😛

Hinterlasse einen Kommentar!

Time limit is exhausted. Please reload the CAPTCHA.

»Informationen zum Artikel

Autor: Simon
Datum: 30.12.2008
Zeit: 20:09 Uhr
Kategorien: OOP & Design Patterns
Gelesen: 10926x heute: 3x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta