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.
L'utilisation typique des registres dans Zend Framework est par des méthodes statiques
dans la classe Zend_Registry
. Alternativement, la classe est un
tableau, donc vous pouvez avoir accès aux éléments stockés avec une interface semblable au
tableau.
Pour enregistrer une valeur dans le registre, il faut utiliser la méthode statique
set()
.
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 set()
pour enregistrer une nouvelle valeur.
L'index peut être un scalaire (NULL
, chaîne, ou nombre), comme un
tableau ordinaire.
Pour récupérer une entrée dans le registre,il faut utiliser la méthode statique
get()
.
La méthode getInstance()
retourne l'objet registre en entier. Un
objet registre est itératif, rendant les valeurs stockées facilement accessibles.
Exemple 660. Exemple d'itération du registre
$registry = Zend_Registry::getInstance(); foreach ($registry as $index => $value) { echo "Le registre index $index contient :\n"; var_dump($value); }
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.
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.
Utiliser le constructeur traditionnel new pour créer une instance du registre. Ceci vous donne la possibilité d'initialiser les entrées du registre avec un tableau associatif.
Exemple 661. Exemple de construction d'un registre
$registry = new Zend_Registry(array('index' => $value));
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 setInstance()
.
Exemple 662. Exemple d'initialisation d'un registre statique
$registry = new Zend_Registry(array('index' => $value)); Zend_Registry::setInstance($registry);
La méthode setInstance()
lèvera une
Zend_Exception
si un registre statique a déjà été initialisé lors
de son premier accès.
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.
Exemple 663. Exemple d'accès de type tableau
$registry = Zend_Registry::getInstance(); $registry['index'] = $value; var_dump( $registry['index'] );
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 ArrayObject::ARRAY_AS_PROPS
et initialiser l'instance statique. Vous devez faire ceci avant d'accéder au registre
statique. Attention en utilisant cette option, puisque certaines
versions de PHP ont des bugs quand il utilise le registre avec cette option.
Problèmes connus avec l'option
ArrayObject::ARRAY_AS_PROPS
Certaines versions de PHP sont réputées buggués lors de l'utilisation de
l'option de registre ArrayObject::ARRAY_AS_PROPS
.
Exemple 664. Exemple d'accès de type objet
// 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);
Pour savoir si un index particulier du registre a une valeur, il faut utiliser la
méthode statique isRegistered()
.
Exemple 665. Exemple avec la méthode isRegistered()
if (Zend_Registry::isRegistered($index)) { $value = Zend_Registry::get($index); }
Pour savoir si un index particulier du registre de type tableau a une valeur, il
faut utiliser la fonction isset()
comme vous le feriez avec un tableau
ordinaire.
Exemple 666. Exemple avec la méthode isset()
$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 ); }
Le registre statique est une instance de la classe
Zend_Registry
. Si vous voulez ajouter une fonctionnalité au
registre, vous pouvez créer une classe qui étend Zend_Registry
et
ensuite vous pouvez spécifier cette classe comme la classe à utiliser pour le registre
statique. Utilisez la méthode statique setClassName()
pour spécifier la
classe.
Note
La classe doit étendre Zend_Registry
.
Exemple 667. Exemple d'affectation d'un nom de classe au registre
Zend_Registry::setClassName('Mon_Registre'); Zend_Registry::set('index', $value);
L'enregistrement lève une Zend_Exception
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.
Bien que ce ne soit pas normalement nécessaire, vous pouvez décharger l'instance
de votre registre. Utilisez la méthode statique _unsetInstance()
.
Risque de perte de données
Quand vous utilisez le code _unsetInstance()
, toutes les données
dans le registre statique sont perdues et ne peuvent pas être récupérées.
Vous pourriez utiliser cette méthode, par exemple, si vous voulez utiliser
setInstance()
ou setClassName()
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
Zend_Registry
de cette manière n'est pas recommandé dans les
applications.
Exemple 668. Exemple avec la méthode _unsetInstance()
Zend_Registry::set('index', $value); Zend_Registry::_unsetInstance(); // Changer la classe Zend_Registry::setClassName('Mon_Registre'); Zend_Registry::set('index', $value);