Zend_Registry.xml 11 KB

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