Содержание
Реестр является контейнером для хранения объектов и значений в среде приложения. Посредством сохранения значения в реестре объект становится доступным всему приложению. Этот механизм является альтернативой использованию глобальных переменных.
Типовое использование реестра - использование статических методов класса Zend_Registry. Вы можете также обращаться к элементам, сохраненным в реестре, как к элементам массива, поскольку класс реестра наследует от ArrayObject.
Для того, чтобы сохранить значение в реестре, используйте
статический метод set()
.
Сохраняемое значение может быть объектом, массивом или скаляром. Вы
можете изменить значение, сохраненное под определенным индексом в
реестре, устанавливая новое значение методом set()
.
Индекс может быть строкой или целочисленным значением, как в обычном массиве.
Для того, чтобы получить запись из реестра, используйте статический
метод get()
.
Метод getInstance()
возвращает статический объект
реестра.
По объекту реестра можно производить итерацию.
Пример 31.3. Пример итерации по реестру
<?php $registry = Zend_Registry::getInstance(); foreach ($registry as $index => $value) { echo "Registry index $index contains:\n"; var_dump($value); } ?>
Кроме доступа к статическому реестру через статические методы, вы можете также непосредственно создавать экземпляр реестра и использовать его как объект.
Экземпляр реестра, к которому вы обращаетесь через статические методы, просто является одним из таких экземпляров. Это сделано в целях удобства, т.к. оно сохраняется статически и вы можете обращаться к нему из любого места своего приложения.
Используйте традиционный конструктор 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.6. Пример доступа как к массиву
<?php $registry = Zend_Registry::getInstance(); $registry['index'] = $value; var_dump( $registry['index'] ); ?>
К реестру можно обращаться так же, как к объекту, используя имена
индексов как имена свойств объекта. Для этого нужно специальным
образом создать объект, используя опцию
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); ?>
Для проверки того, существует ли в реестре значение под определенным
индексом, используйте 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 ); } ?>
Статический реестр является экземпляром класса Zend_Registry. Если
вы хотите добавить в реестр дополнительный функционал, то можете
создать класс, наследующий от Zend_Registry и определить его как
используемый для статического реестра. Используйте статический метод
setClassName()
для установки класса. Этот класс должен
наследовать от Zend_Registry.
Пример 31.10. Пример установки класса статического реестра
<?php Zend_Registry::setClassName('My_Registry'); Zend_Registry::set('index', $value); ?>
Реестр бросает исключение, если вы пытаетесь установить имя класса, используемого для статического реестра, после того, как было первое обращение к реестру. Рекомендуется устанавливать имя класса в загрузочном коде.
Хотя обычно в этом нет необходимости, вы можете уничтожить
статический экземпляр реестра. Для этого используйте метод
_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); ?>