Содержание
Реестр является контейнером для хранения объектов и значений в среде приложения. Посредством сохранения значения в реестре объект становится доступным всему приложению. Этот механизм является альтернативой использованию глобальных переменных.
Типовое использование реестра - использование статических методов класса Zend_Registry. Вы можете также обращаться к элементам, сохраненным в реестре, как к элементам массива, поскольку класс реестра наследует от ArrayObject.
Для того, чтобы сохранить значение в реестре, используйте
статический метод set().
Сохраняемое значение может быть объектом, массивом или скаляром. Вы
можете изменить значение, сохраненное под определенным индексом в
реестре, устанавливая новое значение методом set().
Индекс может быть строкой или целочисленным значением, как в обычном массиве.
Для того, чтобы получить запись из реестра, используйте статический
метод get().
Метод getInstance() возвращает статический объект
реестра.
По объекту реестра можно производить итерацию.
Кроме доступа к статическому реестру через статические методы, вы можете также непосредственно создавать экземпляр реестра и использовать его как объект.
Экземпляр реестра, к которому вы обращаетесь через статические методы, просто является одним из таких экземпляров. Это сделано в целях удобства, т.к. оно сохраняется статически и вы можете обращаться к нему из любого места своего приложения.
Используйте традиционный конструктор new для создания
экземпляра реестра. Это дает возможность иницизировать записи в
реестре так же, как в массиве.
Пример 25.4. Пример создания реестра
<?php
$registry = new Zend_Registry(array('index' => $value));
?>
После создания экземпляра вы можете использовать его с применением
методов доступа ArrayObject, или установить его как
статический экземпляр, используя статический метод
setInstance().
Пример 25.5. Пример инициализации статического реестра
<?php
$registry = new Zend_Registry(array('index' => $value));
Zend_Registry::setInstance($registry);
?>
Метод setInstance() бросает исключение Zend_Exception,
если статический реестр уже был проинициализирован при
первого обращении к нему.
Если необходимо установить или получить несколько значений, то может быть удобным использовать для этого нотацию доступа к массивам.
К реестру можно обращаться так же, как к объекту, используя имена
индексов как имена свойств объекта. Для этого нужно специальным
образом создать объект, используя опцию
ArrayObject::ARRAY_AS_PROPS, и инициализировать
статический экземпляр. Необходимо сделать это до того, как будет
сделано первое обращение к статическому реестру.
Будьте осторожны, используя эту
опцию, поскольку некоторые версии PHP имеют ошибки, связанные с этой
опцией.
Пример 25.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); ?>
Для проверки того, существует ли в реестре значение под определенным
индексом, используйте isRegistered().
Пример 25.8. Пример использования метода isRegistered()
<?php
if (Zend_Registry::isRegistered($index)) {
$value = Zend_Registry::get($index);
}
?>
Для того, чтобы найти определенный индекс в объекте реестра, используйте конструкцию isset(), как в случае обычного массива.
Пример 25.9. Пример использования метода 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.
Пример 25.10. Пример установки класса статического реестра
<?php
Zend_Registry::setClassName('My_Registry');
Zend_Registry::set('index', $value);
?>
Реестр бросает исключение, если вы пытаетесь установить имя класса, используемого для статического реестра, после того, как было первое обращение к реестру. Рекомендуется устанавливать имя класса в загрузочном коде.
Хотя обычно в этом нет необходимости, вы можете уничтожить
статический экземпляр реестра. Для этого используйте метод
_unsetInstance().
![]() |
Угроза потери данных |
|---|---|
Когда используете |
Вы можете применять данный метод, если, например, хотите
использовать setInstance() или
setClassName() после того, как был проинциализирован
объект статического реестра. Уничтожение статического экземпляра
дает возможность использовать эти методы.