Zend_Registry.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.registry.using">
  5. <title>Die Registry verwenden</title>
  6. <para>
  7. Eine Registry ist ein Container für das Speichern von Objekten und Werten im
  8. Raum der Anwendung. Durch das Speichern der Werte in einer Registry steht das
  9. selbe Objekt immer innerhalb der kompletten Anwendung zur Verfügung.
  10. Dieser Mechanismus ist eine Alernative zur Verwendung eines Globalen Speichers.
  11. </para>
  12. <para>
  13. Die typische Methode um Registries mit dem Zend Framework zu verwenden ist
  14. durch die statischen Methoden in der <classname>Zend_Registry</classname> Klasse. Alternativ kann die
  15. Registry als Arrayobjekt verwendet werden, und so können Elemente welche darin gespeichert
  16. wurden durch ein gewöhnliches Array-artiges Interface verwendet werden.
  17. </para>
  18. <sect2 id="zend.registry.using.storing">
  19. <title>Werte in die Registry speichern</title>
  20. <para>
  21. Verwende die statische Methode <code>set()</code> um einen Eintrag in der Registry zu Speichern.
  22. </para>
  23. <example id="zend.registry.using.storing.example">
  24. <title>Beispiel der Verwendung der <code>set()</code> Methode</title>
  25. <programlisting role="php"><![CDATA[
  26. Zend_Registry::set('index', $value);
  27. ]]>
  28. </programlisting>
  29. </example>
  30. <para>
  31. Der zurückgegebene Wert kann ein Objekt, ein Array oder ein Skalar sein.
  32. Der gespeicherte Wert in einem speziellen Eintrag der Registry
  33. kann durch den Aufruf der <code>set()</code> Methode verändert werden um
  34. den Eintrag auf einen neuen Wert zu setzen.
  35. </para>
  36. <para>
  37. Der Index kann ein Skalar (<code>null</code>, String oder Nummer),
  38. sowie ein gewöhnliches Array sein.
  39. </para>
  40. </sect2>
  41. <sect2 id="zend.registry.using.retrieving">
  42. <title>Werte aus der Registry lesen</title>
  43. <para>
  44. Um einen Eintrag von der Registry zu erhalten, kann die statische
  45. <code>get()</code> Methode verwendet werden.
  46. </para>
  47. <example id="zend.registry.using.retrieving.example">
  48. <title>Beispiel der Verwendung der <code>get()</code> Methode</title>
  49. <programlisting role="php"><![CDATA[
  50. $value = Zend_Registry::get('index');
  51. ]]>
  52. </programlisting>
  53. </example>
  54. <para>
  55. Die <code>getInstance()</code> Methode gibt ein Singleton Registry Objekt zurück.
  56. Dieses Registry Objekt ist durchsuchbar, und erlaubt es auf alle in der Registry gespeicherten
  57. Werte einfach zuzugreifen.
  58. </para>
  59. <example id="zend.registry.using.retrieving.example-iterating">
  60. <title>Beispiel des Durchsuchens der Registry</title>
  61. <programlisting role="php"><![CDATA[
  62. $registry = Zend_Registry::getInstance();
  63. foreach ($registry as $index => $value) {
  64. echo "Registry Index $index enthält:\n";
  65. var_dump($value);
  66. }
  67. ]]>
  68. </programlisting>
  69. </example>
  70. </sect2>
  71. <sect2 id="zend.registry.using.constructing">
  72. <title>Erstellen eines Registry Objektes</title>
  73. <para>
  74. Zusätzlich zur Verwendung der statischen Registry über die statischen Methoden,
  75. kann eine Instanz direkt erzeugt werden und als Objekt verwendet werden.
  76. </para>
  77. <para>
  78. Die Registry Instanz die durch die statischen Methoden verwendet wird,
  79. ist einfach eine solche Instanz. Es ist eine Vereinfachung die statisch
  80. gespeichert ist damit Sie von überall innerhalb einer Anwendung verwendet
  81. werden kann.
  82. </para>
  83. <para>
  84. Der traditionelle <code>new</code> Operator kann verwendet werden um
  85. <classname>Zend_Registry</classname> zu initiieren. Das Initiieren von <classname>Zend_Registry</classname>
  86. mit seinem Konstruktor initiiert auch die Einträge in der Registry einfach durch die
  87. Verwendung eines assoziativen Arrays als Argument.
  88. </para>
  89. <example id="zend.registry.using.constructing.example">
  90. <title>Beispiel für das Erstellen einer Registry</title>
  91. <programlisting role="php"><![CDATA[
  92. $registry = new Zend_Registry(array('index' => $value));
  93. ]]>
  94. </programlisting>
  95. </example>
  96. <para>
  97. Sobald so ein <classname>Zend_Registry</classname> Objekt initiiert wurde, kann es durch den
  98. Aufruf irgendeiner Array Objektmethode verwendet werden, oder indem es als
  99. Singleton Instanz für <classname>Zend_Registry</classname> mit der statischen Methode
  100. <code>setInstance()</code> gesetzt wird.
  101. </para>
  102. <example id="zend.registry.using.constructing.example-setinstance">
  103. <title>Beispiel der Initialisierung der Singleton Registry</title>
  104. <programlisting role="php"><![CDATA[
  105. $registry = new Zend_Registry(array('index' => $value));
  106. Zend_Registry::setInstance($registry);
  107. ]]>
  108. </programlisting>
  109. </example>
  110. <para>
  111. Die <code>setInstance()</code> Methode wirft eine <classname>Zend_Exception</classname> wenn die
  112. statische Registry bereits initialisiert wurde.
  113. </para>
  114. </sect2>
  115. <sect2 id="zend.registry.using.array-access">
  116. <title>Auf die Registry als Array zugreifen</title>
  117. <para>
  118. Wenn mehrere Werte gesetzt oder gelesen werden sollen, kann es einfacher
  119. sein auf die Registry in Array Schreibweise zuzugreifen.
  120. </para>
  121. <example id="zend.registry.using.array-access.example">
  122. <title>Beispiel eines Array-zugriffs</title>
  123. <programlisting role="php"><![CDATA[
  124. $registry = Zend_Registry::getInstance();
  125. $registry['index'] = $value;
  126. var_dump( $registry['index'] );
  127. ]]>
  128. </programlisting>
  129. </example>
  130. </sect2>
  131. <sect2 id="zend.registry.using.array-object">
  132. <title>Zugriff auf die Registry als Objekt</title>
  133. <para>
  134. Manchmal ist es einfacher auf die Registry in einer Objekt-Orientierten
  135. Art und Weise zuzugreifen, durch Verwendung von Indexnamen als Objekt Eigenschaften.
  136. Man muß das Registry Objekt mit der <code>ArrayObject::ARRAY_AS_PROPS</code>
  137. Option erstellen und die statische Instanz initialisieren um diese Funktionalität
  138. einzuschalten.
  139. <note>
  140. <para>
  141. Man muß die <code>ArrayObject::ARRAY_AS_PROPS</code> Option setzen
  142. <emphasis>bevor</emphasis> auf die statische Registry das erste Mal
  143. zugegriffen wird.
  144. </para>
  145. </note>
  146. </para>
  147. <warning>
  148. <title>Bekannte Probleme mit der <code>ArrayObject::ARRAY_AS_PROPS</code> Option</title>
  149. <para>
  150. Einige Versionen von PHP sind bekanntermaßen sehr fehlerhaft wenn die Registry mit der
  151. <code>ArrayObject::ARRAY_AS_PROPS</code> Option verwendet wird.
  152. </para>
  153. </warning>
  154. <example id="zend.registry.using.array-object.example">
  155. <title>Beispiel eines Objektzugriffs</title>
  156. <programlisting role="php"><![CDATA[
  157. // In der Anwendungs Bootstrap Datei:
  158. $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
  159. Zend_Registry::setInstance($registry);
  160. $registry->tree = 'Apfel';
  161. .
  162. .
  163. .
  164. // In einer anderen Funktion, irgendwo in der Anwendung:
  165. $registry = Zend_Registry::getInstance();
  166. echo $registry->tree; // Gibt "Apfel" aus
  167. $registry->index = $value;
  168. var_dump($registry->index);
  169. ]]>
  170. </programlisting>
  171. </example>
  172. </sect2>
  173. <sect2 id="zend.registry.using.isset">
  174. <title>Abfragen ob ein Index existiert</title>
  175. <para>
  176. Um herauszufinden ob ein bestimmter Index in der Registry gesetzt wurde,
  177. kann die statische Methode <code>isRegistered()</code> verwendet werden.
  178. </para>
  179. <example id="zend.registry.using.isset.example-isregistered">
  180. <title>Beispiel der Verwendung der isRegistered() Methode</title>
  181. <programlisting role="php"><![CDATA[
  182. if (Zend_Registry::isRegistered($index)) {
  183. $value = Zend_Registry::get($index);
  184. }
  185. ]]>
  186. </programlisting>
  187. </example>
  188. <para>
  189. Um herauszufinden ob ein bestimmter Index in einem Registry Array oder Objekt
  190. einen Wert hat kann die <code>isset()</code> Methode verwendet werden, wie bei einem
  191. gewöhnlichen Array.
  192. </para>
  193. <example id="zend.registry.using.isset.example-isset">
  194. <title>Beispiel der Verwendung der <code>isset()</code> Methode</title>
  195. <programlisting role="php"><![CDATA[
  196. $registry = Zend_Registry::getInstance();
  197. // Verwendung der Array Syntax
  198. if (isset($registry['index'])) {
  199. var_dump( $registry['index'] );
  200. }
  201. // Verwendung der Objekt Syntax
  202. if (isset($registry->index)) {
  203. var_dump( $registry->index );
  204. }
  205. ]]>
  206. </programlisting>
  207. </example>
  208. </sect2>
  209. <sect2 id="zend.registry.using.subclassing">
  210. <title>Erweitern der Registry</title>
  211. <para>
  212. Die statische Registry ist eine Instanz der Klasse <classname>Zend_Registry</classname>.
  213. Wenn Funktionalität zur Registry hinzugefügt werden soll, sollte eine
  214. Klasse erstellt werden die <classname>Zend_Registry</classname> erweitert und dann kann diese
  215. spezielle Klasse definiert werden um das Singleton in der statische Registry zu initiieren.
  216. Die statische Methode <code>setClassName()</code> kann verwendet
  217. werden um die Klasse zu definieren.
  218. <note>
  219. <para>
  220. Diese Klasse muß eine Unterklasse von <classname>Zend_Registry</classname> sein.
  221. </para>
  222. </note>
  223. </para>
  224. <example id="zend.registry.using.subclassing.example">
  225. <title>Beispiel des Definierens des Singleton Registry Klassennamens</title>
  226. <programlisting role="php"><![CDATA[
  227. Zend_Registry::setClassName('Meine_Registry');
  228. Zend_Registry::set('index', $value);
  229. ]]>
  230. </programlisting>
  231. </example>
  232. <para>
  233. Die Registry wirft eine <classname>Zend_Exception</classname> wenn man versucht den Klassennamen
  234. zu setzen nachdem die Registry das erste Mal verwendet wurde. Es ist deshalb
  235. notwendig den Klassennamen für die statische Registry in der Bootstrap
  236. Datei der Anwendung zu definieren.
  237. </para>
  238. </sect2>
  239. <sect2 id="zend.registry.using.unsetting">
  240. <title>Entfernen der statischen Registry</title>
  241. <para>
  242. Obwohl es normalerweise nicht notwendig ist, kann die Singleton Instanz
  243. der Registry entfernt werden. Die statische Methode
  244. <code>_unsetInstance()</code> verwendet werden, um das zu tun.
  245. </para>
  246. <warning>
  247. <title>Risiko des Datenverlustes</title>
  248. <para>
  249. Wenn <code>_unsetInstance()</code> verwendet wird,
  250. werden alle Daten in der statischen Registry verworfen und können
  251. nicht wiederhergestellt werden.
  252. </para>
  253. </warning>
  254. <para>
  255. Diese Methode kann zum Beispiel verwendet werden, wenn
  256. <code>setInstance()</code> oder <code>setClassName()</code> nach der
  257. Initialisierung des Singleton Registry Objektes verwendet werden soll.
  258. Entfernen der Singleton Instanz erlaubt die Benutzung dieser Methoden
  259. selbst nachdem das Singleton Registry Objekt gesetzt wurde. Die Verwendung
  260. von <classname>Zend_Registry</classname> auf diese Weise ist für typische Anwendungen
  261. und Umgebungen nicht empfohlen.
  262. </para>
  263. <example id="zend.registry.using.unsetting.example">
  264. <title>Beispiel der Verwendung der <code>_unsetInstance()</code> Methode</title>
  265. <programlisting role="php"><![CDATA[
  266. Zend_Registry::set('index', $value);
  267. Zend_Registry::_unsetInstance();
  268. // Ändern der Klasse
  269. Zend_Registry::setClassName('Meine_Registry');
  270. Zend_Registry::set('index', $value);
  271. ]]>
  272. </programlisting>
  273. </example>
  274. </sect2>
  275. </sect1>
  276. <!--
  277. vim:se ts=4 sw=4 et:
  278. -->