# Utiliser le registre

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.

## Mettre des valeurs dans le registre

Pour enregistrer une valeur dans le registre, il faut utiliser la méthode statique `set()`.

### Exemple avec la méthode `set()`

    Zend_Registry::set('index', $value);

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.

## Lire des valeurs du registre

Pour récupérer une entrée dans le registre,il faut utiliser la méthode statique `get()`.

### Exemple avec la méthode `get()`

    $value = Zend_Registry::get('index');

La méthode `getInstance()` retourne l'objet registre en entier. Un objet registre est itératif, rendant les valeurs stockées facilement accessibles.

### 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);
    }

## Construire un objet registre

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 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 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.

## Accéder au registre comme à un tableau

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 d'accès de type tableau

    $registry = Zend_Registry::getInstance();

    $registry['index'] = $value;

    var_dump( $registry['index'] );

## Accéder au registre comme à un objet

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 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);

## Vérifier si un index existe

Pour savoir si un index particulier du registre a une valeur, il faut utiliser la méthode statique `isRegistered()`.

### Exemple avec la méthode i`sRegistered()`

    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 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 );
    }

## Étendre le registre

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.

La classe doit étendre `Zend_Registry`.

### 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.

## Décharger le registre statique

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 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);