[ZF-10089] Zend_Log
[zend.git] / documentation / manual / zh / module_specs / Zend_Registry.xml
blob8519b20dac905b1ebb51c0b7890491676f3c2123
1 <sect1 id="zend.registry.using">
3     <title>使用对象注册表(Registry)</title>
5     <para>
6         对象注册表(或称对象仓库)是一个用于在整个应用空间(application space)内存储对象和值的容器。通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象。这种机制相当于一种全局存储。
7     </para>
9     <para>
10         我们可以通过Zend_Registry类的静态方法来使用对象注册表,另外,由于该类是一个数组对象,你可以使用数组形式来访问其中的类方法。
11     </para>
13     <sect2 id="zend.registry.using.storing">
15         <title>设置Registry中的值</title>
17         <para>
18             要保存一项内容到注册表中,我们可以使用静态方法 <code>set()</code>。
19         </para>
21         <example id="zend.registry.using.storing.example">
22             <title>set() 使用示例:</title>
23             <programlisting role="php"><![CDATA[
24 Zend_Registry::set('index', $value);
25 ]]>
26            </programlisting>
27         </example>
29         <para>
30             $value可以是一个对象、数组或者标量。你可以再次使用<code>set()</code>来为注册表中已有的值设置一个新值。
31         </para>
33         <para>
34             index参数可以是一个标量,即字符串或整数,就像使用数组一样,类似于数组的索引/键名。
35         </para>
37     </sect2>
39     <sect2 id="zend.registry.using.retrieving">
41         <title>获取Registry中的值</title>
43         <para>
44             可以使用 <code>get()</code>方法来获取Registry中某项内容的值。
45         </para>
47         <example id="zend.registry.using.retrieving.example">
48             <title> get() 方法示例:</title>
49             <programlisting role="php"><![CDATA[
50 $value = Zend_Registry::get('index');
51 ]]>
52            </programlisting>
53         </example>
55         <para>
56              <code>getInstance()</code>返回静态registry对象。
57         </para>
59         <para>
60             registry对象是可迭代的(iterable)。
61         </para>
63         <example id="zend.registry.using.retrieving.example-iterating">
64             <title>迭代一个registry对象:</title>
65             <programlisting role="php"><![CDATA[
66 $registry = Zend_Registry::getInstance();
68 foreach ($registry as $index => $value) {
69     echo "Registry index $index contains:\n";
70     var_dump($value);
72 ]]>
73            </programlisting>
74         </example>
76     </sect2>
78     <sect2 id="zend.registry.using.constructing">
80         <title>创建一个Registry对象</title>
82         <para>
83             除了可以使用静态方法来访问Registry对象之外,你可以直接实例化它,就像使用普通的对象一样。
84         </para>
86         <para>
88             如果通过静态方法来访问registry对象的实例,它很方便进行静态存储,你可以在程序中的任何地方访问它。
89         </para>
91         <para>
92             如果使用传统的<code>new</code> 方法来创建registry的实例,则你可以使用数组一样的方式来初始化registry中的内容。
93         </para>
95         <example id="zend.registry.using.constructing.example">
96             <title>创建一个registry对象</title>
97             <programlisting role="php"><![CDATA[
98 $registry = new Zend_Registry(array('index' => $value));
99 ]]>
100            </programlisting>
101         </example>
103         <para>
104             在创建这个对象实例之后,你可以使用数组对象方法来使用它,或者你可以把这个对象实例通过静态方法<code>setInstance()</code>设置为静态对象实例。
105         </para>
107         <example id="zend.registry.using.constructing.example-setinstance">
108             <title>Example of initializing the static registry</title>
109             <programlisting role="php"><![CDATA[
110 $registry = new Zend_Registry(array('index' => $value));
112 Zend_Registry::setInstance($registry);
114            </programlisting>
115         </example>
117         <para>
118             如果静态的注册表对象已经被初始化过,则<code>setInstance()</code>方法会抛出一个Zend_Exception异常。
119         </para>
121     </sect2>
123     <sect2 id="zend.registry.using.array-access">
125         <title>像访问数组一样访问Registry对象</title>
127         <para>
128                如果你要一次访问或设置多个值,你会发现使用数组方式是很方便的。
129         </para>
131         <example id="zend.registry.using.array-access.example">
132             <title>array 方式访问示例:</title>
133             <programlisting role="php"><![CDATA[
134 $registry = Zend_Registry::getInstance();
136 $registry['index'] = $value;
138 var_dump( $registry['index'] );
140            </programlisting>
141         </example>
143     </sect2>
145     <sect2 id="zend.registry.using.array-object">
147         <title>对象方式访问Registry</title>
149         <para>
151             你会发现使用面向对象风格来访问registry对象也是方便的,对象中的属性名称作为索引。
154             要这样做,你需要使用<code>ArrayObject::ARRAY_AS_PROPS</code>选项来创建registry对象,并初始化静态实例。你要在静态的registry被第一次访问之前就完成这个工作。<emphasis role="strong">小心</emphasis>使用这个选项,因为某些版本的PHP在使用这个选项时会有bug。
155         </para>
157         <example id="zend.registry.using.array-object.example">
158             <title>对象形式的访问:</title>
159             <programlisting role="php"><![CDATA[
160 //在你的bootstrap代码中:
161 $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
162 Zend_Registry::setInstance($registry);
163 $registry->tree = 'apple';
169 //在程序的任何其它地方:
170 $registry = Zend_Registry::getInstance();
172 echo $registry->tree; // echo's "apple"
174 $registry->index = $value;
176 var_dump($registry->index);
178            </programlisting>
179         </example>
181     </sect2>
183     <sect2 id="zend.registry.using.isset">
185         <title>查询一个索引是否存在</title>
187         <para>
188              可以使用静态方法<code>isRegistered()</code>来查询是否某个特定的索引已经设置了相应的值。
189         </para>
191         <example id="zend.registry.using.isset.example-isregistered">
192             <title>isRegistered() 示例:</title>
193             <programlisting role="php"><![CDATA[
194 if (Zend_Registry::isRegistered($index)) {
195     $value = Zend_Registry::get($index);
198            </programlisting>
199         </example>
201         <para>
203             要确定一个数组对象中的某个特定索引的值是否设定,可以使用isset()函数,就像在普通的数组中那样使用。
204         </para>
206         <example id="zend.registry.using.isset.example-isset">
207             <title>isset() 示例:</title>
208             <programlisting role="php"><![CDATA[
209 $registry = Zend_Registry::getInstance();
211 // using array-access syntax
212 if (isset($registry['index'])) {
213     var_dump( $registry['index'] );
216 // using object-access syntax, if enabled
217 if (isset($registry->index)) {
218     var_dump( $registry->index );
221            </programlisting>
222         </example>
224     </sect2>
226     <sect2 id="zend.registry.using.subclassing">
228         <title>扩展Registry对象</title>
230         <para>
231             静态registry对象是类Zend_Registry的一个实例。如果你想给它增加功能,你可以继承Zend_Registry类,然后指定使用这个类来访问对象注册表。你可以使用静态方法<code>setClassName()</code>来指定使用这个类。注意这个类一定要是Zend_Registry的子类。
232         </para>
234         <example id="zend.registry.using.subclassing.example">
235             <title>指定静态注册表的类名:</title>
236             <programlisting role="php"><![CDATA[
237 Zend_Registry::setClassName('My_Registry');
239 Zend_Registry::set('index', $value);
241            </programlisting>
242         </example>
244         <para>
246             如果你在registry已经被访问过后尝试设定该类名,则registry抛出一个异常。建议你在boostrap代码(即index.php)中设置该类名。
247         </para>
249     </sect2>
251     <sect2 id="zend.registry.using.unsetting">
253         <title>删除静态注册表</title>
255         <para>
256             尽管这不是必需的,你可以使用<code>_unsetInstance()</code>方法来删除registry的静态实例。
257         </para>
259         <note>
260             <title>数据丢失的风险</title>
261             <para>
262                在使用<code>_unsetInstance()</code>的时候,静态注册表中的所有数据都会丢失并且无法恢复。
263             </para>
264         </note>
266         <para>
267             有时你可能需要<code>_unsetInstance()</code>这个方法。例如你想在已经初始化过registry对象之后,再使用<code>setInstance()</code>或 <code>setClassName()</code>,那么你可以使用<code>_unsetInstance()</code>先把静态实例删除了,然后才能使用那些方法。
268         </para>
270         <example id="zend.registry.using.unsetting.example">
271             <title> _unsetInstance() 示例:</title>
272             <programlisting role="php"><![CDATA[
273 Zend_Registry::set('index', $value);
275 Zend_Registry::_unsetInstance();
277 // 改变我们要使用的类
278 Zend_Registry::setClassName('My_Registry');
280 Zend_Registry::set('index', $value);
282            </programlisting>
283         </example>
285     </sect2>
287 </sect1>
288 <!--
289 vim:se ts=4 sw=4 et: