Zend_Registry.xml 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <sect1 id="zend.registry.using">
  2. <title>使用对象注册表(Registry)</title>
  3. <para>
  4. 对象注册表(或称对象仓库)是一个用于在整个应用空间(application space)内存储对象和值的容器。通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象。这种机制相当于一种全局存储。
  5. </para>
  6. <para>
  7. 我们可以通过Zend_Registry类的静态方法来使用对象注册表,另外,由于该类是一个数组对象,你可以使用数组形式来访问其中的类方法。
  8. </para>
  9. <sect2 id="zend.registry.using.storing">
  10. <title>设置Registry中的值</title>
  11. <para>
  12. 要保存一项内容到注册表中,我们可以使用静态方法 <code>set()</code>。
  13. </para>
  14. <example id="zend.registry.using.storing.example">
  15. <title>set() 使用示例:</title>
  16. <programlisting role="php"><![CDATA[
  17. Zend_Registry::set('index', $value);
  18. ]]>
  19. </programlisting>
  20. </example>
  21. <para>
  22. $value可以是一个对象、数组或者标量。你可以再次使用<code>set()</code>来为注册表中已有的值设置一个新值。
  23. </para>
  24. <para>
  25. index参数可以是一个标量,即字符串或整数,就像使用数组一样,类似于数组的索引/键名。
  26. </para>
  27. </sect2>
  28. <sect2 id="zend.registry.using.retrieving">
  29. <title>获取Registry中的值</title>
  30. <para>
  31. 可以使用 <code>get()</code>方法来获取Registry中某项内容的值。
  32. </para>
  33. <example id="zend.registry.using.retrieving.example">
  34. <title> get() 方法示例:</title>
  35. <programlisting role="php"><![CDATA[
  36. $value = Zend_Registry::get('index');
  37. ]]>
  38. </programlisting>
  39. </example>
  40. <para>
  41. <code>getInstance()</code>返回静态registry对象。
  42. </para>
  43. <para>
  44. registry对象是可迭代的(iterable)。
  45. </para>
  46. <example id="zend.registry.using.retrieving.example-iterating">
  47. <title>迭代一个registry对象:</title>
  48. <programlisting role="php"><![CDATA[
  49. $registry = Zend_Registry::getInstance();
  50. foreach ($registry as $index => $value) {
  51. echo "Registry index $index contains:\n";
  52. var_dump($value);
  53. }
  54. ]]>
  55. </programlisting>
  56. </example>
  57. </sect2>
  58. <sect2 id="zend.registry.using.constructing">
  59. <title>创建一个Registry对象</title>
  60. <para>
  61. 除了可以使用静态方法来访问Registry对象之外,你可以直接实例化它,就像使用普通的对象一样。
  62. </para>
  63. <para>
  64. 如果通过静态方法来访问registry对象的实例,它很方便进行静态存储,你可以在程序中的任何地方访问它。
  65. </para>
  66. <para>
  67. 如果使用传统的<code>new</code> 方法来创建registry的实例,则你可以使用数组一样的方式来初始化registry中的内容。
  68. </para>
  69. <example id="zend.registry.using.constructing.example">
  70. <title>创建一个registry对象</title>
  71. <programlisting role="php"><![CDATA[
  72. $registry = new Zend_Registry(array('index' => $value));
  73. ]]>
  74. </programlisting>
  75. </example>
  76. <para>
  77. 在创建这个对象实例之后,你可以使用数组对象方法来使用它,或者你可以把这个对象实例通过静态方法<code>setInstance()</code>设置为静态对象实例。
  78. </para>
  79. <example id="zend.registry.using.constructing.example-setinstance">
  80. <title>Example of initializing the static registry</title>
  81. <programlisting role="php"><![CDATA[
  82. $registry = new Zend_Registry(array('index' => $value));
  83. Zend_Registry::setInstance($registry);
  84. ]]>
  85. </programlisting>
  86. </example>
  87. <para>
  88. 如果静态的注册表对象已经被初始化过,则<code>setInstance()</code>方法会抛出一个Zend_Exception异常。
  89. </para>
  90. </sect2>
  91. <sect2 id="zend.registry.using.array-access">
  92. <title>像访问数组一样访问Registry对象</title>
  93. <para>
  94. 如果你要一次访问或设置多个值,你会发现使用数组方式是很方便的。
  95. </para>
  96. <example id="zend.registry.using.array-access.example">
  97. <title>array 方式访问示例:</title>
  98. <programlisting role="php"><![CDATA[
  99. $registry = Zend_Registry::getInstance();
  100. $registry['index'] = $value;
  101. var_dump( $registry['index'] );
  102. ]]>
  103. </programlisting>
  104. </example>
  105. </sect2>
  106. <sect2 id="zend.registry.using.array-object">
  107. <title>对象方式访问Registry</title>
  108. <para>
  109. 你会发现使用面向对象风格来访问registry对象也是方便的,对象中的属性名称作为索引。
  110. 要这样做,你需要使用<code>ArrayObject::ARRAY_AS_PROPS</code>选项来创建registry对象,并初始化静态实例。你要在静态的registry被第一次访问之前就完成这个工作。<emphasis role="strong">小心</emphasis>使用这个选项,因为某些版本的PHP在使用这个选项时会有bug。
  111. </para>
  112. <example id="zend.registry.using.array-object.example">
  113. <title>对象形式的访问:</title>
  114. <programlisting role="php"><![CDATA[
  115. //在你的bootstrap代码中:
  116. $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
  117. Zend_Registry::setInstance($registry);
  118. $registry->tree = 'apple';
  119. .
  120. .
  121. .
  122. //在程序的任何其它地方:
  123. $registry = Zend_Registry::getInstance();
  124. echo $registry->tree; // echo's "apple"
  125. $registry->index = $value;
  126. var_dump($registry->index);
  127. ]]>
  128. </programlisting>
  129. </example>
  130. </sect2>
  131. <sect2 id="zend.registry.using.isset">
  132. <title>查询一个索引是否存在</title>
  133. <para>
  134. 可以使用静态方法<code>isRegistered()</code>来查询是否某个特定的索引已经设置了相应的值。
  135. </para>
  136. <example id="zend.registry.using.isset.example-isregistered">
  137. <title>isRegistered() 示例:</title>
  138. <programlisting role="php"><![CDATA[
  139. if (Zend_Registry::isRegistered($index)) {
  140. $value = Zend_Registry::get($index);
  141. }
  142. ]]>
  143. </programlisting>
  144. </example>
  145. <para>
  146. 要确定一个数组对象中的某个特定索引的值是否设定,可以使用isset()函数,就像在普通的数组中那样使用。
  147. </para>
  148. <example id="zend.registry.using.isset.example-isset">
  149. <title>isset() 示例:</title>
  150. <programlisting role="php"><![CDATA[
  151. $registry = Zend_Registry::getInstance();
  152. // using array-access syntax
  153. if (isset($registry['index'])) {
  154. var_dump( $registry['index'] );
  155. }
  156. // using object-access syntax, if enabled
  157. if (isset($registry->index)) {
  158. var_dump( $registry->index );
  159. }
  160. ]]>
  161. </programlisting>
  162. </example>
  163. </sect2>
  164. <sect2 id="zend.registry.using.subclassing">
  165. <title>扩展Registry对象</title>
  166. <para>
  167. 静态registry对象是类Zend_Registry的一个实例。如果你想给它增加功能,你可以继承Zend_Registry类,然后指定使用这个类来访问对象注册表。你可以使用静态方法<code>setClassName()</code>来指定使用这个类。注意这个类一定要是Zend_Registry的子类。
  168. </para>
  169. <example id="zend.registry.using.subclassing.example">
  170. <title>指定静态注册表的类名:</title>
  171. <programlisting role="php"><![CDATA[
  172. Zend_Registry::setClassName('My_Registry');
  173. Zend_Registry::set('index', $value);
  174. ]]>
  175. </programlisting>
  176. </example>
  177. <para>
  178. 如果你在registry已经被访问过后尝试设定该类名,则registry抛出一个异常。建议你在boostrap代码(即index.php)中设置该类名。
  179. </para>
  180. </sect2>
  181. <sect2 id="zend.registry.using.unsetting">
  182. <title>删除静态注册表</title>
  183. <para>
  184. 尽管这不是必需的,你可以使用<code>_unsetInstance()</code>方法来删除registry的静态实例。
  185. </para>
  186. <note>
  187. <title>数据丢失的风险</title>
  188. <para>
  189. 在使用<code>_unsetInstance()</code>的时候,静态注册表中的所有数据都会丢失并且无法恢复。
  190. </para>
  191. </note>
  192. <para>
  193. 有时你可能需要<code>_unsetInstance()</code>这个方法。例如你想在已经初始化过registry对象之后,再使用<code>setInstance()</code>或 <code>setClassName()</code>,那么你可以使用<code>_unsetInstance()</code>先把静态实例删除了,然后才能使用那些方法。
  194. </para>
  195. <example id="zend.registry.using.unsetting.example">
  196. <title> _unsetInstance() 示例:</title>
  197. <programlisting role="php"><![CDATA[
  198. Zend_Registry::set('index', $value);
  199. Zend_Registry::_unsetInstance();
  200. // 改变我们要使用的类
  201. Zend_Registry::setClassName('My_Registry');
  202. Zend_Registry::set('index', $value);
  203. ]]>
  204. </programlisting>
  205. </example>
  206. </sect2>
  207. </sect1>
  208. <!--
  209. vim:se ts=4 sw=4 et:
  210. -->