Содержание
Реестр является контейнером для хранения объектов и значений в среде приложения. Посредством сохранения значения в реестре объект становится доступным всему приложению. Этот механизм является альтернативой использованию глобальных переменных.
Типовое использование реестра - использование статических методов класса 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()
после того, как был проинциализирован
объект статического реестра. Уничтожение статического экземпляра
дает возможность использовать эти методы.