1 <sect1 id="zend.registry.using">
3 <title>Использование реестра<!--Using the Registry--></title>
6 Реестр является контейнером для хранения объектов и значений в
7 среде приложения. Посредством сохранения значения в реестре
8 объект становится доступным всему приложению. Этот механизм является
9 альтернативой использованию глобальных переменных.
11 The registry is a container for storing objects and values in the
12 application space. By storing the value in the registry, the same
13 object is always available throughout your application.
14 This mechanism is an alternative to using global storage.
19 Типовое использование реестра - использование статических методов класса
20 Zend_Registry. Вы можете также обращаться к элементам, сохраненным в
21 реестре, как к элементам массива, поскольку класс реестра наследует от
24 The typical usage of the registry is through static methods in the
25 Zend_Registry class. Alternatively, the class is an array object,
26 so you can access elements stored within it with a convenient
31 <sect2 id="zend.registry.using.storing">
33 <title>Установка значений в реестре<!--Setting Values in the Registry--></title>
36 Для того, чтобы сохранить значение в реестре, используйте
37 статический метод <code>set()</code>.
39 To store an entry in the registry, use the static method
44 <example id="zend.registry.using.storing.example">
45 <title>Пример использования метода set()<!--Example of set() method--></title>
46 <programlisting language="php"><![CDATA[<?php
48 Zend_Registry::set('index', $value);
50 ?>]]></programlisting>
54 Сохраняемое значение может быть объектом, массивом или скаляром. Вы
55 можете изменить значение, сохраненное под определенным индексом в
56 реестре, устанавливая новое значение методом <code>set()</code>.
58 The value can be an object, an array, or a scalar.
59 You can change the value stored in a specific entry of
60 the registry by using <code>set()</code> to set it
66 Индекс может быть строкой или целочисленным значением, как в обычном
69 The index can be a scalar, either string or integer,
70 like an ordinary array.
76 <sect2 id="zend.registry.using.retrieving">
78 <title>Получение значений из реестра<!--Getting Values from the Registry--></title>
81 Для того, чтобы получить запись из реестра, используйте статический
82 метод <code>get()</code>.
84 To retrieve an entry from the registry, use the static method
89 <example id="zend.registry.using.retrieving.example">
90 <title>Пример использования метода get()<!--Example of get() method--></title>
91 <programlisting language="php"><![CDATA[<?php
93 $value = Zend_Registry::get('index');
95 ?>]]></programlisting>
99 Метод <code>getInstance()</code> возвращает статический объект
102 The <code>getInstance()</code> method returns the static registry object.
107 По объекту реестра можно производить итерацию.
109 A registry object is iterable.
113 <example id="zend.registry.using.retrieving.example-iterating">
114 <title>Пример итерации по реестру<!--Example of iterating over the registry--></title>
115 <programlisting language="php"><![CDATA[<?php
117 $registry = Zend_Registry::getInstance();
119 foreach ($registry as $index => $value) {
120 echo "Registry index $index contains:\n";
124 ?>]]></programlisting>
129 <sect2 id="zend.registry.using.constructing">
131 <title>Создание объекта реестра<!--Constructing a Registry Object--></title>
134 Кроме доступа к статическому реестру через статические методы, вы
135 можете также непосредственно создавать экземпляр реестра и
136 использовать его как объект.
138 In addition to accessing the static registry through
139 static methods, you can create an instance directly and
145 Экземпляр реестра, к которому вы обращаетесь через статические
146 методы, просто является одним из таких экземпляров. Это сделано в
147 целях удобства, т.к. оно сохраняется статически и вы можете
148 обращаться к нему из любого места своего приложения.
150 The registry instance you access through the
151 static methods is simply one such instance, and it is
152 for convenience that it is stored statically, so you
153 can access it from anywhere in your appliation.
158 Используйте традиционный конструктор <code>new</code> для создания
159 экземпляра реестра. Это дает возможность иницизировать записи в
160 реестре так же, как в массиве.
162 Use a traditional <code>new</code> constructor to create
163 an instance of the registry. This gives you the opportunity
164 to initialize the entries in the registry as an associatve
169 <example id="zend.registry.using.constructing.example">
170 <title>Пример создания реестра<!--Example of constructing a registry--></title>
171 <programlisting language="php"><![CDATA[<?php
173 $registry = new Zend_Registry(array('index' => $value));
175 ?>]]></programlisting>
179 После создания экземпляра вы можете использовать его с применением
180 методов доступа ArrayObject, или установить его как
181 статический экземпляр, используя статический метод
182 <code>setInstance()</code>.
184 After constructing this instance, you can use it using
185 array-object methods, or you can set this instance
186 to become the static instance using the static method
187 <code>setInstance()</code>.
191 <example id="zend.registry.using.constructing.example-setinstance">
192 <title>Пример инициализации статического реестра<!--Example of initializing the static registry--></title>
193 <programlisting language="php"><![CDATA[<?php
195 $registry = new Zend_Registry(array('index' => $value));
197 Zend_Registry::setInstance($registry);
199 ?>]]></programlisting>
203 Метод <code>setInstance()</code> бросает исключение Zend_Exception,
204 если статический реестр уже был проинициализирован до
205 первого обращения к нему.
207 The <code>setInstance()</code> method throws a Zend_Exception
208 if the static registry has already been initialized by its
215 <sect2 id="zend.registry.using.array-access">
217 <title>Доступ к реестру как к массиву<!--Accessing the Registry as an Array--></title>
220 Если необходимо установить или получить несколько значений, то
221 может быть удобным использовать для этого нотацию доступа к
224 If you have several values to get or set, you may find it
225 convenient to access the registry with array notation.
229 <example id="zend.registry.using.array-access.example">
230 <title>Пример доступа как к массиву<!--Example of array access--></title>
231 <programlisting language="php"><![CDATA[<?php
233 $registry = Zend_Registry::getInstance();
235 $registry['index'] = $value;
237 var_dump( $registry['index'] );
239 ?>]]></programlisting>
244 <sect2 id="zend.registry.using.array-object">
246 <title>Доступ к реестру как к объекту <!--Accessing the Registry as an Object--></title>
249 К реестру можно обращаться так же, как к объекту, используя имена
250 индексов как имена свойств объекта. Для этого нужно специальным
251 образом создать объект, используя опцию
252 <code>ArrayObject::ARRAY_AS_PROPS</code>, и инициализировать
253 статический экземпляр. Необходимо сделать это до того, как будет
254 сделано первое обращение к статическому реестру.
255 <emphasis>Будьте осторожны</emphasis>, используя эту
256 опцию, поскольку некоторые версии PHP имеют ошибки, связанные с этой
259 You may also find it convenient to access the registry
260 in an object-oriented fashion, using index names as object
262 To do this, you need to specifically construct the registry
263 object using the <code>ArrayObject::ARRAY_AS_PROPS</code> option,
264 and initialize the static instance. You must do this before
265 the static registry has been accessed for the first time.
266 <emphasis>Beware</emphasis> of using this option,
267 since some versions of PHP have bugs when using the registry
272 <example id="zend.registry.using.array-object.example">
273 <title>Пример доступа как к объекту<!--Example of object access--></title>
274 <programlisting language="php"><![CDATA[<?php
276 // в загрузочном коде:
277 $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
278 Zend_Registry::setInstance($registry);
279 $registry->tree = 'apple';
285 // в различных функциях и где-либо еще в приложении:
286 $registry = Zend_Registry::getInstance();
288 echo $registry->tree; // выводит "apple"
290 $registry->index = $value;
292 var_dump($registry->index);
294 ?>]]></programlisting>
299 <sect2 id="zend.registry.using.isset">
301 <title>Проверка существования индекса<!--Querying if an index exists--></title>
304 Для проверки того, существует ли в реестре значение под определенным
305 индексом, используйте <code>isRegistered()</code>.
307 To find out if a particular index in the registry
308 has a value, use the static method <code>isRegistered()</code>.
312 <example id="zend.registry.using.isset.example-isregistered">
313 <title>Пример использования метода isRegistered()<!--Example of isRegistered() method--></title>
314 <programlisting language="php"><![CDATA[<?php
316 if (Zend_Registry::isRegistered($index)) {
317 $value = Zend_Registry::get($index);
320 ?>]]></programlisting>
324 Для того, чтобы найти определенный индекс в объекте реестра,
325 используйте конструкцию isset(), как в случае обычного массива.
327 To find out if a particular index in a registry
328 array-object has a value, use <code>isset()</code>
329 like you would with an ordinary array.
333 <example id="zend.registry.using.isset.example-isset">
334 <title>Пример использования метода isset()<!--Example of isset() method--></title>
335 <programlisting language="php"><![CDATA[<?php
337 $registry = Zend_Registry::getInstance();
339 // используется синтаксис доступа к массиву
340 if (isset($registry['index'])) {
341 var_dump( $registry['index'] );
344 // используется синтаксис доступа к объекту (должен быть включен)
345 if (isset($registry->index)) {
346 var_dump( $registry->index );
349 ?>]]></programlisting>
354 <sect2 id="zend.registry.using.subclassing">
356 <title>Создание подклассов<!--Extending the Registry--></title>
359 Статический реестр является экземпляром класса Zend_Registry. Если
360 вы хотите добавить в реестр дополнительный функционал, то можете
361 создать класс, наследующий от Zend_Registry и определить его как
362 используемый для статического реестра. Используйте статический метод
363 <code>setClassName()</code> для установки класса. Этот класс должен
364 наследовать от Zend_Registry.
366 The static registry is an instance of the class Zend_Registry.
367 If you want to add functionality to the registry, you can
368 create a class that extends Zend_Registry, and then you can
369 specify this class as the class to use for the static registry.
370 Use the static method <code>setClassName()</code> to specify
371 the class. The class must extend Zend_Registry.
375 <example id="zend.registry.using.subclassing.example">
376 <title>Пример установки класса статического реестра<!--Example of specifying the static registry's class name--></title>
377 <programlisting language="php"><![CDATA[<?php
379 Zend_Registry::setClassName('My_Registry');
381 Zend_Registry::set('index', $value);
383 ?>]]></programlisting>
387 Реестр бросает исключение, если вы пытаетесь установить имя класса,
388 используемого для статического реестра, после того, как было первое
389 обращение к реестру. Рекомендуется устанавливать имя класса в
392 The registry throws a Zend_Exception if you try to set the
393 classname after the registry has been accessed for the first time.
394 It is recommended that you specify the classname for your
395 static registry in your application bootstrap.
401 <sect2 id="zend.registry.using.unsetting">
403 <title>Уничтожение статического реестра<!--Unsetting the Static Registry--></title>
406 Хотя обычно в этом нет необходимости, вы можете уничтожить
407 статический экземпляр реестра. Для этого используйте метод
408 <code>_unsetInstance()</code>.
410 Although it is not normally necessary, you can
411 unset the static instance of the registry.
412 Use the static method <code>_unsetInstance()</code>.
417 <title>Угроза потери данных<!--Data loss risk--></title>
419 Когда используете <code>_unsetInstance()</code>, все данные
420 в статическом реестре удаляются и не могут быть восстановлены.
422 When you use <code>_unsetInstance()</code>,
423 all data in the static registry are
424 discarded and cannot be recovered.
430 Вы можете применять данный метод, если, например, хотите
431 использовать <code>setInstance()</code> или
432 <code>setClassName()</code> после того, как был проинциализирован
433 объект статического реестра. Уничтожение статического экземпляра
434 дает возможность использовать эти методы.
436 You might use this method, for example, if you want to
437 use <code>setInstance()</code> or <code>setClassName()</code>
438 after the static registry object has been initialized.
439 Unsetting the static instance allows you to use these methods.
443 <example id="zend.registry.using.unsetting.example">
444 <title>Пример использования метода _unsetInstance()<!--Example of _unsetInstance() method--></title>
445 <programlisting language="php"><![CDATA[<?php
447 Zend_Registry::set('index', $value);
449 Zend_Registry::_unsetInstance();
452 Zend_Registry::setClassName('My_Registry');
454 Zend_Registry::set('index', $value);
456 ?>]]></programlisting>