# Использование реестра

Реестр является контейнером для хранения объектов и значений в среде приложения. Посредством сохранения значения в реестре объект становится доступным всему приложению. Этот механизм является альтернативой использованию глобальных переменных.

Типовое использование реестра - использование статических методов класса Zend_Registry. Вы можете также обращаться к элементам, сохраненным в реестре, как к элементам массива, поскольку класс реестра наследует от ArrayObject.

## Установка значений в реестре

Для того, чтобы сохранить значение в реестре, используйте статический метод `set()`.

### Пример использования метода set()

    <?php

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

    ?>

Сохраняемое значение может быть объектом, массивом или скаляром. Вы можете изменить значение, сохраненное под определенным индексом в реестре, устанавливая новое значение методом `set()`.

Индекс может быть строкой или целочисленным значением, как в обычном массиве.

## Получение значений из реестра

Для того, чтобы получить запись из реестра, используйте статический метод `get()`.

### Пример использования метода get()

    <?php

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

    ?>

Метод `getInstance()` возвращает статический объект реестра.

По объекту реестра можно производить итерацию.

### Пример итерации по реестру

    <?php

    $registry = Zend_Registry::getInstance();

    foreach ($registry as $index => $value) {
        echo "Registry index $index contains:\n";
        var_dump($value);
    }

    ?>

## Создание объекта реестра

Кроме доступа к статическому реестру через статические методы, вы можете также непосредственно создавать экземпляр реестра и использовать его как объект.

Экземпляр реестра, к которому вы обращаетесь через статические методы, просто является одним из таких экземпляров. Это сделано в целях удобства, т.к. оно сохраняется статически и вы можете обращаться к нему из любого места своего приложения.

Используйте традиционный конструктор `new` для создания экземпляра реестра. Это дает возможность иницизировать записи в реестре так же, как в массиве.

### Пример создания реестра

    <?php

    $registry = new Zend_Registry(array('index' => $value));

    ?>

После создания экземпляра вы можете использовать его с применением методов доступа ArrayObject, или установить его как статический экземпляр, используя статический метод `setInstance()`.

### Пример инициализации статического реестра

    <?php

    $registry = new Zend_Registry(array('index' => $value));

    Zend_Registry::setInstance($registry);

    ?>

Метод `setInstance()` бросает исключение Zend_Exception, если статический реестр уже был проинициализирован до первого обращения к нему.

## Доступ к реестру как к массиву

Если необходимо установить или получить несколько значений, то может быть удобным использовать для этого нотацию доступа к массивам.

### Пример доступа как к массиву

    <?php

    $registry = Zend_Registry::getInstance();

    $registry['index'] = $value;

    var_dump( $registry['index'] );

    ?>

## Доступ к реестру как к объекту

К реестру можно обращаться так же, как к объекту, используя имена индексов как имена свойств объекта. Для этого нужно специальным образом создать объект, используя опцию `ArrayObject::ARRAY_AS_PROPS`, и инициализировать статический экземпляр. Необходимо сделать это до того, как будет сделано первое обращение к статическому реестру. Будьте осторожны, используя эту опцию, поскольку некоторые версии PHP имеют ошибки, связанные с этой опцией.

### Пример доступа как к объекту

    <?php

    // в загрузочном коде:
    $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
    Zend_Registry::setInstance($registry);
    $registry->tree = 'apple';

    .
    .
    .

    // в различных функциях и где-либо еще в приложении:
    $registry = Zend_Registry::getInstance();

    echo $registry->tree; // выводит "apple"

    $registry->index = $value;

    var_dump($registry->index);

    ?>

## Проверка существования индекса

Для проверки того, существует ли в реестре значение под определенным индексом, используйте `isRegistered()`.

### Пример использования метода isRegistered()

    <?php

    if (Zend_Registry::isRegistered($index)) {
        $value = Zend_Registry::get($index);
    }

    ?>

Для того, чтобы найти определенный индекс в объекте реестра, используйте конструкцию isset(), как в случае обычного массива.

### Пример использования метода isset()

    <?php

    $registry = Zend_Registry::getInstance();

    // используется синтаксис доступа к массиву
    if (isset($registry['index'])) {
        var_dump( $registry['index'] );
    }

    // используется синтаксис доступа к объекту (должен быть включен)
    if (isset($registry->index)) {
        var_dump( $registry->index );
    }

    ?>

## Создание подклассов

Статический реестр является экземпляром класса Zend_Registry. Если вы хотите добавить в реестр дополнительный функционал, то можете создать класс, наследующий от Zend_Registry и определить его как используемый для статического реестра. Используйте статический метод `setClassName()` для установки класса. Этот класс должен наследовать от Zend_Registry.

### Пример установки класса статического реестра

    <?php

    Zend_Registry::setClassName('My_Registry');

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

    ?>

Реестр бросает исключение, если вы пытаетесь установить имя класса, используемого для статического реестра, после того, как было первое обращение к реестру. Рекомендуется устанавливать имя класса в загрузочном коде.

## Уничтожение статического реестра

Хотя обычно в этом нет необходимости, вы можете уничтожить статический экземпляр реестра. Для этого используйте метод `_unsetInstance()`.

### Угроза потери данных

Когда используете `_unsetInstance()`, все данные в статическом реестре удаляются и не могут быть восстановлены.

Вы можете применять данный метод, если, например, хотите использовать `setInstance()` или `setClassName()` после того, как был проинциализирован объект статического реестра. Уничтожение статического экземпляра дает возможность использовать эти методы.

### Пример использования метода _unsetInstance()

    <?php

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

    Zend_Registry::_unsetInstance();

    // изменение класса
    Zend_Registry::setClassName('My_Registry');

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

    ?>