| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- <!-- EN-Revision: 13945 -->
- <sect1 id="zend.registry.using">
- <title>Utiliser le registre</title>
- <para>Un registre est un conteneur pour stocker des objets et des valeurs dans l'espace d'application. En stockant
- la valeur dans le registre, le même objet est toujours disponible partout dans votre application. Ce mécanisme est
- une alternative à l'utilisation du stockage global.</para>
- <para>L'utilisation typique des registres dans Zend Framework est par des méthodes statiques dans la classe
- <classname>Zend_Registry</classname>. Alternativement, la classe est un tableau, donc vous pouvez avoir accès aux éléments
- stockés avec une interface semblable au tableau.</para>
- <sect2 id="zend.registry.using.storing">
- <title>Mettre des valeurs dans le registre</title>
- <para>Pour enregistrer une valeur dans le registre, il faut utiliser la méthode statique
- <code>set()</code>.</para>
- <example id="zend.registry.using.storing.example">
- <title>Exemple avec la méthode <code>set()</code></title>
- <programlisting role="php"><![CDATA[
- Zend_Registry::set('index', $value);
- ]]></programlisting>
- </example>
- <para>La valeur peut être un objet, un tableau, ou un scalaire. Vous pouvez changer la valeur stockée dans une
- entrée spécifique du registre en utilisant <code>set()</code> pour enregistrer une nouvelle valeur.</para>
- <para>L'index peut être un scalaire (<code>null</code>, chaîne, ou nombre), comme un tableau ordinaire.</para>
- </sect2>
- <sect2 id="zend.registry.using.retrieving">
- <title>Lire des valeurs du registre</title>
- <para>Pour récupérer une entrée dans le registre,il faut utiliser la méthode statique <code>get()</code>.</para>
- <example id="zend.registry.using.retrieving.example">
- <title>Exemple avec la méthode <code>get()</code></title>
- <programlisting role="php"><![CDATA[
- $value = Zend_Registry::get('index');
- ]]></programlisting>
- </example>
- <para>La méthode <code>getInstance()</code> retourne l'objet registre en entier. Un objet registre est itératif,
- rendant les valeurs stockées facilement accessibles.</para>
- <example id="zend.registry.using.retrieving.example-iterating">
- <title>Exemple d'itération du registre</title>
- <programlisting role="php"><![CDATA[
- $registry = Zend_Registry::getInstance();
- foreach ($registry as $index => $value) {
- echo "Le registre index $index contient :\n";
- var_dump($value);
- }
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.registry.using.constructing">
- <title>Construire un objet registre</title>
- <para>En plus de pouvoir accéder au registre grâce aux méthodes statiques, vous pous pouvez créer une instance
- directement et l'utiliser en tant qu'objet.</para>
- <para>L'instance du registre à laquelle vous avez accès par les méthodes statiques est simplement une instance
- et il est plus commode qu'il soit stocké statiquement, afin d'y avoir accès partout dans votre
- application.</para>
- <para>Utiliser le constructeur traditionnel <code>new</code> pour créer une instance du registre. Ceci vous
- donne la possibilité d'initialiser les entrées du registre avec un tableau associatif.</para>
- <example id="zend.registry.using.constructing.example">
- <title>Exemple de construction d'un registre</title>
- <programlisting role="php"><![CDATA[
- $registry = new Zend_Registry(array('index' => $value));
- ]]></programlisting>
- </example>
- <para>Après avoir construit cette instance, vous pouvez l'utiliser avec les fonctions habituelles de tableau, ou
- vous pouvez rendre cette instance statique en utilisant la méthode <code>setInstance()</code>.</para>
- <example id="zend.registry.using.constructing.example-setinstance">
- <title>Exemple d'initialisation d'un registre statique</title>
- <programlisting role="php"><![CDATA[
- $registry = new Zend_Registry(array('index' => $value));
- Zend_Registry::setInstance($registry);
- ]]></programlisting>
- </example>
- <para>La méthode <code>setInstance()</code> lèvera une <classname>Zend_Exception</classname> si un registre statique a
- déjà été initialisé lors de son premier accès.</para>
- </sect2>
- <sect2 id="zend.registry.using.array-access">
- <title>Accéder au registre comme à un tableau</title>
- <para>Si vous avez plusieurs valeurs à récupérer ou à enregistrer, vous pouvez trouver intéressant d'avoir accès
- au registre avec une notation de type tableau.</para>
- <example id="zend.registry.using.array-access.example">
- <title>Exemple d'accès de type tableau</title>
- <programlisting role="php"><![CDATA[
- $registry = Zend_Registry::getInstance();
- $registry['index'] = $value;
- var_dump( $registry['index'] );
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.registry.using.array-object">
- <title>Accéder au registre comme à un objet</title>
- <para>Vous pouvez trouver aussi intéressant d'accéder au registre d'une manière orientée objet en utilisant les
- noms d'index comme des propriétés d'objet. Pour cela, vous devez spécifier au constructeur du registre l'option
- <code>ArrayObject::ARRAY_AS_PROPS</code> et initialiser l'instance statique. Vous devez faire ceci avant
- d'accéder au registre statique. <emphasis role="strong">Attention</emphasis> en utilisant cette option, puisque
- certaines versions de PHP ont des bugs quand il utilise le registre avec cette option.</para>
- <warning>
- <title>Problèmes connus avec l'option <code>ArrayObject::ARRAY_AS_PROPS</code></title>
- <para>Certaines versions de PHP sont réputées buggués lors de l'utilisation de l'option de registre
- <code>ArrayObject::ARRAY_AS_PROPS</code>.</para>
- </warning>
- <example id="zend.registry.using.array-object.example">
- <title>Exemple d'accès de type objet</title>
- <programlisting role="php"><![CDATA[
- // Dans votre fichier de lancement de l'application
- $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
- Zend_Registry::setInstance($registry);
- $registry->tree='apple';
- // Ailleurs dans l'application
- $registry = Zend_Registry::getInstance();
- echo $registry->tree; // affiche 'apple'
- $registry->index = $value;
- var_dump($registry->index);
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.registry.using.isset">
- <title>Vérifier si un index existe</title>
- <para>Pour savoir si un index particulier du registre a une valeur, il faut utiliser la méthode statique
- <code>isRegistered()</code>.</para>
- <example id="zend.registry.using.isset.example-isregistered">
- <title>Exemple avec la méthode i<code>sRegistered()</code></title>
- <programlisting role="php"><![CDATA[
- if (Zend_Registry::isRegistered($index)) {
- $value = Zend_Registry::get($index);
- }
- ]]></programlisting>
- </example>
- <para>Pour savoir si un index particulier du registre de type tableau a une valeur, il faut utiliser la fonction
- <code>isset()</code> comme vous le feriez avec un tableau ordinaire.</para>
- <example id="zend.registry.using.isset.example-isset">
- <title>Exemple avec la méthode <code>isset()</code></title>
- <programlisting role="php"><![CDATA[
- $registry = Zend_Registry::getInstance();
- // En utilisant la syntaxe de type tableau
- if (isset($registry['index'])) {
- var_dump( $registry['index'] );
- }
- // En utilisant la syntaxe de type objet, si activé
- if (isset($registry->index)) {
- var_dump( $registry->index );
- }
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.registry.using.subclassing">
- <title>Étendre le registre</title>
- <para>Le registre statique est une instance de la classe <classname>Zend_Registry</classname>. Si vous voulez ajouter une
- fonctionnalité au registre, vous pouvez créer une classe qui étend <classname>Zend_Registry</classname> et ensuite vous
- pouvez spécifier cette classe comme la classe à utiliser pour le registre statique. Utilisez la méthode statique
- <code>setClassName()</code> pour spécifier la classe.</para>
- <note>
- <para>La classe doit étendre <classname>Zend_Registry</classname>.</para>
- </note>
- <example id="zend.registry.using.subclassing.example">
- <title>Exemple d'affectation d'un nom de classe au registre</title>
- <programlisting role="php"><![CDATA[
- Zend_Registry::setClassName('Mon_Registre');
- Zend_Registry::set('index', $value);
- ]]></programlisting>
- </example>
- <para>L'enregistrement lève une <classname>Zend_Exception</classname> si vous essayez d'affecter un nom de classe après
- que le registre ait eu un premier accès. Il est recommandé de spécifier le nom de classe pour votre registre
- statique dans le fichier de lancement de votre application.</para>
- </sect2>
- <sect2 id="zend.registry.using.unsetting">
- <title>Décharger le registre statique</title>
- <para>Bien que ce ne soit pas normalement nécessaire, vous pouvez décharger l'instance de votre registre.
- Utilisez la méthode statique <code>_unsetInstance()</code>.</para>
- <note>
- <title>Risque de perte de données</title>
- <para>Quand vous utilisez le code <code>_unsetInstance()</code>, toutes les données dans le registre
- statique sont perdues et ne peuvent pas être récupérées.</para>
- </note>
- <para>Vous pourriez utiliser cette méthode, par exemple, si vous voulez utiliser <code>setInstance()</code> ou
- <code>setClassName()</code> après que l'objet de registre statique a été initialisé. Décharger l'instance
- statique vous permet d'utiliser ces méthodes même après instanciation de l'objet registre. Utiliser
- <classname>Zend_Registry</classname> de cette manière n'est pas recommandé dans les applications.</para>
- <example id="zend.registry.using.unsetting.example">
- <title>Exemple avec la méthode <code>_unsetInstance()</code></title>
- <programlisting role="php"><![CDATA[
- Zend_Registry::set('index', $value);
- Zend_Registry::_unsetInstance();
- // Changer la classe
- Zend_Registry::setClassName('Mon_Registre');
- Zend_Registry::set('index', $value);
- ]]></programlisting>
- </example>
- </sect2>
- </sect1>
|