Глава 31. Zend_Registry

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

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

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

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

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

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

<?php

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

?>

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

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

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

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

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

<?php

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

?>

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

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

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

<?php

$registry = Zend_Registry::getInstance();

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

?>

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

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

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

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

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

<?php

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

?>

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

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

<?php

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

Zend_Registry::setInstance($registry);

?>

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

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

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

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

<?php

$registry = Zend_Registry::getInstance();

$registry['index'] = $value;

var_dump( $registry['index'] );

?>

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

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

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

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

?>

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

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

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

<?php

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

?>

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

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

<?php

$registry = Zend_Registry::getInstance();

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

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

?>

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

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

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

<?php

Zend_Registry::setClassName('My_Registry');

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

?>

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

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

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

[Замечание] Угроза потери данных

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

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

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

<?php

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

Zend_Registry::_unsetInstance();

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

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

?>

    Поддержать сайт на родительском проекте КГБ