Zend_Registry.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.registry.using">
  5. <title>Utiliser le registre</title>
  6. <para>
  7. Un registre est un conteneur pour stocker des objets et des valeurs dans l'espace
  8. d'application. En stockant la valeur dans le registre, le même objet est toujours disponible
  9. partout dans votre application. Ce mécanisme est une alternative à l'utilisation du stockage
  10. global.
  11. </para>
  12. <para>
  13. L'utilisation typique des registres dans Zend Framework est par des méthodes statiques
  14. dans la classe <classname>Zend_Registry</classname>. Alternativement, la classe est un
  15. tableau, donc vous pouvez avoir accès aux éléments stockés avec une interface semblable au
  16. tableau.
  17. </para>
  18. <sect2 id="zend.registry.using.storing">
  19. <title>Mettre des valeurs dans le registre</title>
  20. <para>
  21. Pour enregistrer une valeur dans le registre, il faut utiliser la méthode statique
  22. <methodname>set()</methodname>.
  23. </para>
  24. <example id="zend.registry.using.storing.example">
  25. <title>Exemple avec la méthode <methodname>set()</methodname></title>
  26. <programlisting language="php"><![CDATA[
  27. Zend_Registry::set('index', $value);
  28. ]]></programlisting>
  29. </example>
  30. <para>
  31. La valeur peut être un objet, un tableau, ou un scalaire. Vous pouvez changer la
  32. valeur stockée dans une entrée spécifique du registre en utilisant <methodname>set()</methodname>
  33. pour enregistrer une nouvelle valeur.
  34. </para>
  35. <para>
  36. L'index peut être un scalaire (<constant>NULL</constant>, chaîne, ou nombre), comme un
  37. tableau ordinaire.
  38. </para>
  39. </sect2>
  40. <sect2 id="zend.registry.using.retrieving">
  41. <title>Lire des valeurs du registre</title>
  42. <para>
  43. Pour récupérer une entrée dans le registre,il faut utiliser la méthode statique
  44. <methodname>get()</methodname>.
  45. </para>
  46. <example id="zend.registry.using.retrieving.example">
  47. <title>Exemple avec la méthode <methodname>get()</methodname></title>
  48. <programlisting language="php"><![CDATA[
  49. $value = Zend_Registry::get('index');
  50. ]]></programlisting>
  51. </example>
  52. <para>
  53. La méthode <methodname>getInstance()</methodname> retourne l'objet registre en entier. Un
  54. objet registre est itératif, rendant les valeurs stockées facilement accessibles.
  55. </para>
  56. <example id="zend.registry.using.retrieving.example-iterating">
  57. <title>Exemple d'itération du registre</title>
  58. <programlisting language="php"><![CDATA[
  59. $registry = Zend_Registry::getInstance();
  60. foreach ($registry as $index => $value) {
  61. echo "Le registre index $index contient :\n";
  62. var_dump($value);
  63. }
  64. ]]></programlisting>
  65. </example>
  66. </sect2>
  67. <sect2 id="zend.registry.using.constructing">
  68. <title>Construire un objet registre</title>
  69. <para>
  70. En plus de pouvoir accéder au registre grâce aux méthodes statiques, vous pous
  71. pouvez créer une instance directement et l'utiliser en tant qu'objet.
  72. </para>
  73. <para>
  74. L'instance du registre à laquelle vous avez accès par les méthodes statiques est
  75. simplement une instance et il est plus commode qu'il soit stocké statiquement, afin d'y
  76. avoir accès partout dans votre application.
  77. </para>
  78. <para>
  79. Utiliser le constructeur traditionnel <emphasis>new</emphasis> pour créer une instance du
  80. registre. Ceci vous donne la possibilité d'initialiser les entrées du registre avec un
  81. tableau associatif.
  82. </para>
  83. <example id="zend.registry.using.constructing.example">
  84. <title>Exemple de construction d'un registre</title>
  85. <programlisting language="php"><![CDATA[
  86. $registry = new Zend_Registry(array('index' => $value));
  87. ]]></programlisting>
  88. </example>
  89. <para>
  90. Après avoir construit cette instance, vous pouvez l'utiliser avec les fonctions
  91. habituelles de tableau, ou vous pouvez rendre cette instance statique en utilisant la
  92. méthode <methodname>setInstance()</methodname>.
  93. </para>
  94. <example id="zend.registry.using.constructing.example-setinstance">
  95. <title>Exemple d'initialisation d'un registre statique</title>
  96. <programlisting language="php"><![CDATA[
  97. $registry = new Zend_Registry(array('index' => $value));
  98. Zend_Registry::setInstance($registry);
  99. ]]></programlisting>
  100. </example>
  101. <para>
  102. La méthode <methodname>setInstance()</methodname> lèvera une
  103. <classname>Zend_Exception</classname> si un registre statique a déjà été initialisé lors
  104. de son premier accès.
  105. </para>
  106. </sect2>
  107. <sect2 id="zend.registry.using.array-access">
  108. <title>Accéder au registre comme à un tableau</title>
  109. <para>
  110. Si vous avez plusieurs valeurs à récupérer ou à enregistrer, vous pouvez trouver
  111. intéressant d'avoir accès au registre avec une notation de type tableau.
  112. </para>
  113. <example id="zend.registry.using.array-access.example">
  114. <title>Exemple d'accès de type tableau</title>
  115. <programlisting language="php"><![CDATA[
  116. $registry = Zend_Registry::getInstance();
  117. $registry['index'] = $value;
  118. var_dump( $registry['index'] );
  119. ]]></programlisting>
  120. </example>
  121. </sect2>
  122. <sect2 id="zend.registry.using.array-object">
  123. <title>Accéder au registre comme à un objet</title>
  124. <para>
  125. Vous pouvez trouver aussi intéressant d'accéder au registre d'une manière orientée
  126. objet en utilisant les noms d'index comme des propriétés d'objet. Pour cela, vous devez
  127. spécifier au constructeur du registre l'option <constant>ArrayObject::ARRAY_AS_PROPS</constant>
  128. et initialiser l'instance statique. Vous devez faire ceci avant d'accéder au registre
  129. statique. <emphasis>Attention</emphasis> en utilisant cette option, puisque certaines
  130. versions de <acronym>PHP</acronym> ont des bugs quand il utilise le registre avec cette option.
  131. </para>
  132. <warning>
  133. <title>Problèmes connus avec l'option
  134. <constant>ArrayObject::ARRAY_AS_PROPS</constant></title>
  135. <para>
  136. Certaines versions de <acronym>PHP</acronym> sont réputées buggués lors de l'utilisation de
  137. l'option de registre <constant>ArrayObject::ARRAY_AS_PROPS</constant>.
  138. </para>
  139. </warning>
  140. <example id="zend.registry.using.array-object.example">
  141. <title>Exemple d'accès de type objet</title>
  142. <programlisting language="php"><![CDATA[
  143. // Dans votre fichier de lancement de l'application
  144. $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
  145. Zend_Registry::setInstance($registry);
  146. $registry->tree='apple';
  147. // Ailleurs dans l'application
  148. $registry = Zend_Registry::getInstance();
  149. echo $registry->tree; // affiche 'apple'
  150. $registry->index = $value;
  151. var_dump($registry->index);
  152. ]]></programlisting>
  153. </example>
  154. </sect2>
  155. <sect2 id="zend.registry.using.isset">
  156. <title>Vérifier si un index existe</title>
  157. <para>
  158. Pour savoir si un index particulier du registre a une valeur, il faut utiliser la
  159. méthode statique <methodname>isRegistered()</methodname>.
  160. </para>
  161. <example id="zend.registry.using.isset.example-isregistered">
  162. <title>Exemple avec la méthode i<methodname>sRegistered()</methodname></title>
  163. <programlisting language="php"><![CDATA[
  164. if (Zend_Registry::isRegistered($index)) {
  165. $value = Zend_Registry::get($index);
  166. }
  167. ]]></programlisting>
  168. </example>
  169. <para>
  170. Pour savoir si un index particulier du registre de type tableau a une valeur, il
  171. faut utiliser la fonction <methodname>isset()</methodname> comme vous le feriez avec un tableau
  172. ordinaire.
  173. </para>
  174. <example id="zend.registry.using.isset.example-isset">
  175. <title>Exemple avec la méthode <methodname>isset()</methodname></title>
  176. <programlisting language="php"><![CDATA[
  177. $registry = Zend_Registry::getInstance();
  178. // En utilisant la syntaxe de type tableau
  179. if (isset($registry['index'])) {
  180. var_dump( $registry['index'] );
  181. }
  182. // En utilisant la syntaxe de type objet, si activé
  183. if (isset($registry->index)) {
  184. var_dump( $registry->index );
  185. }
  186. ]]></programlisting>
  187. </example>
  188. </sect2>
  189. <sect2 id="zend.registry.using.subclassing">
  190. <title>Étendre le registre</title>
  191. <para>
  192. Le registre statique est une instance de la classe
  193. <classname>Zend_Registry</classname>. Si vous voulez ajouter une fonctionnalité au
  194. registre, vous pouvez créer une classe qui étend <classname>Zend_Registry</classname> et
  195. ensuite vous pouvez spécifier cette classe comme la classe à utiliser pour le registre
  196. statique. Utilisez la méthode statique <methodname>setClassName()</methodname> pour spécifier la
  197. classe.
  198. </para>
  199. <note>
  200. <para>La classe doit étendre <classname>Zend_Registry</classname>.</para>
  201. </note>
  202. <example id="zend.registry.using.subclassing.example">
  203. <title>Exemple d'affectation d'un nom de classe au registre</title>
  204. <programlisting language="php"><![CDATA[
  205. Zend_Registry::setClassName('Mon_Registre');
  206. Zend_Registry::set('index', $value);
  207. ]]></programlisting>
  208. </example>
  209. <para>
  210. L'enregistrement lève une <classname>Zend_Exception</classname> si vous essayez
  211. d'affecter un nom de classe après que le registre ait eu un premier accès. Il est
  212. recommandé de spécifier le nom de classe pour votre registre statique dans le fichier de
  213. lancement de votre application.
  214. </para>
  215. </sect2>
  216. <sect2 id="zend.registry.using.unsetting">
  217. <title>Décharger le registre statique</title>
  218. <para>
  219. Bien que ce ne soit pas normalement nécessaire, vous pouvez décharger l'instance
  220. de votre registre. Utilisez la méthode statique <methodname>_unsetInstance()</methodname>.
  221. </para>
  222. <note>
  223. <title>Risque de perte de données</title>
  224. <para>
  225. Quand vous utilisez le code <methodname>_unsetInstance()</methodname>, toutes les données
  226. dans le registre statique sont perdues et ne peuvent pas être récupérées.
  227. </para>
  228. </note>
  229. <para>
  230. Vous pourriez utiliser cette méthode, par exemple, si vous voulez utiliser
  231. <methodname>setInstance()</methodname> ou <methodname>setClassName()</methodname> après que l'objet de registre
  232. statique a été initialisé. Décharger l'instance statique vous permet d'utiliser ces
  233. méthodes même après instanciation de l'objet registre. Utiliser
  234. <classname>Zend_Registry</classname> de cette manière n'est pas recommandé dans les
  235. applications.
  236. </para>
  237. <example id="zend.registry.using.unsetting.example">
  238. <title>Exemple avec la méthode <methodname>_unsetInstance()</methodname></title>
  239. <programlisting language="php"><![CDATA[
  240. Zend_Registry::set('index', $value);
  241. Zend_Registry::_unsetInstance();
  242. // Changer la classe
  243. Zend_Registry::setClassName('Mon_Registre');
  244. Zend_Registry::set('index', $value);
  245. ]]></programlisting>
  246. </example>
  247. </sect2>
  248. </sect1>