Eine Registry ist ein Container für das Speichern von Objekten und Werten im Raum der Anwendung. Durch das Speichern der Werte in einer Registry steht das selbe Objekt immer innerhalb der kompletten Anwendung zur Verfügung. Dieser Mechanismus ist eine Alernative zur Verwendung eines Globalen Speichers.
Die typische Methode um Registries mit dem Zend Framework zu verwenden ist durch die
statischen Methoden in der Zend_Registry
Klasse. Alternativ kann die
Registry als Arrayobjekt verwendet werden, und so können Elemente welche darin gespeichert
wurden durch ein gewöhnliches Array-artiges Interface verwendet werden.
Verwende die statische Methode set()
um einen Eintrag in der
Registry zu Speichern.
Der zurückgegebene Wert kann ein Objekt, ein Array oder ein Skalar sein.
Der gespeicherte Wert in einem speziellen Eintrag der Registry
kann durch den Aufruf der set()
Methode verändert werden um
den Eintrag auf einen neuen Wert zu setzen.
Der Index kann ein Skalar (NULL
, String oder Nummer),
sowie ein gewöhnliches Array sein.
Um einen Eintrag von der Registry zu erhalten, kann die statische
get()
Methode verwendet werden.
Die getInstance()
Methode gibt ein Singleton Registry Objekt
zurück. Dieses Registry Objekt ist durchsuchbar, und erlaubt es auf alle in der Registry
gespeicherten Werte einfach zuzugreifen.
Beispiel 654. Beispiel des Durchsuchens der Registry
$registry = Zend_Registry::getInstance(); foreach ($registry as $index => $value) { echo "Registry Index $index enthält:\n"; var_dump($value); }
Zusätzlich zur Verwendung der statischen Registry über die statischen Methoden, kann eine Instanz direkt erzeugt werden und als Objekt verwendet werden.
Die Registry Instanz die durch die statischen Methoden verwendet wird, ist einfach eine solche Instanz. Es ist eine Vereinfachung die statisch gespeichert ist damit Sie von überall innerhalb einer Anwendung verwendet werden kann.
Der traditionelle new Operator kann verwendet werden um
Zend_Registry
zu initiieren. Das Initiieren von
Zend_Registry
mit seinem Konstruktor initiiert auch die Einträge
in der Registry einfach durch die Verwendung eines assoziativen Arrays als Argument.
Beispiel 655. Beispiel für das Erstellen einer Registry
$registry = new Zend_Registry(array('index' => $value));
Sobald so ein Zend_Registry
Objekt initiiert wurde, kann es durch
den Aufruf irgendeiner Array Objektmethode verwendet werden, oder indem es als
Singleton Instanz für Zend_Registry
mit der statischen Methode
setInstance()
gesetzt wird.
Beispiel 656. Beispiel der Initialisierung der Singleton Registry
$registry = new Zend_Registry(array('index' => $value)); Zend_Registry::setInstance($registry);
Die setInstance()
Methode wirft eine
Zend_Exception
wenn die statische Registry bereits initialisiert
wurde.
Wenn mehrere Werte gesetzt oder gelesen werden sollen, kann es einfacher sein auf die Registry in Array Schreibweise zuzugreifen.
Beispiel 657. Beispiel eines Array-zugriffs
$registry = Zend_Registry::getInstance(); $registry['index'] = $value; var_dump( $registry['index'] );
Manchmal ist es einfacher auf die Registry in einer Objekt-Orientierten
Art und Weise zuzugreifen, durch Verwendung von Indexnamen als Objekt Eigenschaften.
Man muß das Registry Objekt mit der ArrayObject::ARRAY_AS_PROPS
Option erstellen und die statische Instanz initialisieren um diese Funktionalität
einzuschalten.
Anmerkung
Man muß die ArrayObject::ARRAY_AS_PROPS
Option setzen
bevor auf die statische Registry das erste Mal
zugegriffen wird.
Bekannte Probleme mit der ArrayObject::ARRAY_AS_PROPS Option
Einige Versionen von PHP sind bekanntermaßen sehr fehlerhaft wenn
die Registry mit der ArrayObject::ARRAY_AS_PROPS
Option
verwendet wird.
Beispiel 658. Beispiel eines Objektzugriffs
// In der Anwendungs Bootstrap Datei: $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS) Zend_Registry::setInstance($registry); $registry->tree = 'Apfel'; . . . // In einer anderen Funktion, irgendwo in der Anwendung: $registry = Zend_Registry::getInstance(); echo $registry->tree; // Gibt "Apfel" aus $registry->index = $value; var_dump($registry->index);
Um herauszufinden ob ein bestimmter Index in der Registry gesetzt wurde,
kann die statische Methode isRegistered()
verwendet werden.
Beispiel 659. Beispiel der Verwendung der isRegistered() Methode
if (Zend_Registry::isRegistered($index)) { $value = Zend_Registry::get($index); }
Um herauszufinden ob ein bestimmter Index in einem Registry Array oder Objekt
einen Wert hat kann die isset()
Methode verwendet werden, wie
bei einem gewöhnlichen Array.
Beispiel 660. Beispiel der Verwendung der isset() Methode
$registry = Zend_Registry::getInstance(); // Verwendung der Array Syntax if (isset($registry['index'])) { var_dump( $registry['index'] ); } // Verwendung der Objekt Syntax if (isset($registry->index)) { var_dump( $registry->index ); }
Die statische Registry ist eine Instanz der Klasse Zend_Registry
.
Wenn Funktionalität zur Registry hinzugefügt werden soll, sollte eine Klasse
erstellt werden die Zend_Registry
erweitert und dann kann diese
spezielle Klasse definiert werden um das Singleton in der statische Registry zu
initiieren. Die statische Methode setClassName()
kann verwendet
werden um die Klasse zu definieren.
Anmerkung
Diese Klasse muß eine Unterklasse von Zend_Registry
sein.
Beispiel 661. Beispiel des Definierens des Singleton Registry Klassennamens
Zend_Registry::setClassName('Meine_Registry'); Zend_Registry::set('index', $value);
Die Registry wirft eine Zend_Exception
wenn man versucht den
Klassennamen zu setzen nachdem die Registry das erste Mal verwendet wurde. Es ist
deshalb notwendig den Klassennamen für die statische Registry in der Bootstrap
Datei der Anwendung zu definieren.
Obwohl es normalerweise nicht notwendig ist, kann die Singleton Instanz
der Registry entfernt werden. Die statische Methode
_unsetInstance()
verwendet werden, um das zu tun.
Risiko des Datenverlustes
Wenn _unsetInstance()
verwendet wird,
werden alle Daten in der statischen Registry verworfen und können
nicht wiederhergestellt werden.
Diese Methode kann zum Beispiel verwendet werden, wenn
setInstance()
oder setClassName()
nach
der Initialisierung des Singleton Registry Objektes verwendet werden soll.
Entfernen der Singleton Instanz erlaubt die Benutzung dieser Methoden
selbst nachdem das Singleton Registry Objekt gesetzt wurde. Die Verwendung
von Zend_Registry
auf diese Weise ist für typische Anwendungen
und Umgebungen nicht empfohlen.
Beispiel 662. Beispiel der Verwendung der _unsetInstance() Methode
Zend_Registry::set('index', $value); Zend_Registry::_unsetInstance(); // Ändern der Klasse Zend_Registry::setClassName('Meine_Registry'); Zend_Registry::set('index', $value);