Zend_Loader.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.loader.load">
  4. <title>Динамическая загрузка файлов и классов</title>
  5. <para>
  6. Класс <classname>Zend_Loader</classname> включает в себя методы,
  7. помогающие производить динамическую загрузку файлов.
  8. </para>
  9. <tip>
  10. <title>Zend_Loader vs. require_once()</title>
  11. <para>
  12. Методы <classname>Zend_Loader</classname> лучше всего использовать,
  13. когда имя файла для загрузки является переменным - например,
  14. если оно базируется на данных, введенных пользователем,
  15. или аргументе метода.
  16. Если вы загружаете файл или класс, чье имя является постоянным,
  17. то использование <classname>Zend_Loader</classname>
  18. не дает каких-либо преимуществ по сравнению использованием обычных
  19. функций PHP, таких, как
  20. <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>.
  21. </para>
  22. </tip>
  23. <sect2 id="zend.loader.load.file">
  24. <title>Загрузка файлов</title>
  25. <para>
  26. Статический метод <code>Zend_Loader::loadFile()</code> загружает
  27. файл PHP. Загружаемый файл должен содержать код PHP. Метод является
  28. оберткой к PHP-функции
  29. <ulink url="http://php.net/include"><code>include()</code></ulink>.
  30. Этот метод возвращает <constant>FALSE</constant> в случае
  31. неуспеха - например, если требуемый файл не существует.
  32. </para>
  33. <example id="zend.loader.load.file.example">
  34. <title>Пример использования метода loadFile()</title>
  35. <programlisting language="php"><![CDATA[
  36. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  37. ]]></programlisting>
  38. </example>
  39. <para>
  40. Аргумент <varname>$filename</varname> задает имя файла для загрузки, он
  41. не должен содержать путь к файлу. В целях безопасности производится
  42. проверка <varname>$filename</varname>. <varname>$filename</varname> должен
  43. содержать только алфавитно-цифровые символы, тире ("-"), знак
  44. подчеркивания ("_") и точку ("."). На аргумент <varname>$dirs</varname>
  45. эти ограничения не распространяются.
  46. </para>
  47. <para>
  48. Аргумент <varname>$dirs</varname> задает директории, в которых должен
  49. производиться поиск файла. Если его значение равно
  50. <constant>NULL</constant>, то для поиска используется только
  51. <code>include_path</code>. Если его значение является строкой или
  52. массивом, то файл сначала ищется в данной директории (директориях),
  53. а затем в <code>include_path</code>.
  54. </para>
  55. <para>
  56. Аргумент <varname>$once</varname> является значением булевого типа. Если
  57. равен <constant>TRUE</constant>, то <code>Zend_Loader::loadFile()</code> для
  58. загрузки файла использует PHP-функцию
  59. <ulink url="http://php.net/include"><code>include_once()</code></ulink>,
  60. иначе используется функция <ulink url="http://php.net/include_once"><code>include()</code></ulink>.
  61. </para>
  62. </sect2>
  63. <sect2 id="zend.loader.load.class">
  64. <title>Загрузка классов</title>
  65. <para>
  66. Статический метод <code>Zend_Loader::loadClass($class, $dirs)</code>
  67. загружает файл PHP и затем проверяет наличие требуемого класса.
  68. </para>
  69. <example id="zend.loader.load.class.example">
  70. <title>Пример использования метода loadClass()</title>
  71. <programlisting language="php"><![CDATA[
  72. Zend_Loader::loadClass('Container_Tree',
  73. array(
  74. '/home/production/mylib',
  75. '/home/production/myapp'
  76. )
  77. );
  78. ]]></programlisting>
  79. </example>
  80. <para>
  81. Строка, задающая класс, преобразуется в относительный путь
  82. посредством замены знаков подчеркивания разделителями директорий,
  83. используемыми в вашей ОС, и добавления расширения '.php'. В примере
  84. выше на Windows будет использоваться путь 'Container\\Tree.php'.
  85. </para>
  86. <para>
  87. Если <varname>$dirs</varname> является строкой или массивом, то
  88. <code>Zend_Loader::loadClass()</code> ищет в директориях в
  89. том порядке, в котором они были определены. Загружается первый
  90. найденный файл. Если файл не найден в директориях
  91. <varname>$dirs</varname>, то производится поиск в <code>include_path</code>.
  92. </para>
  93. <para>
  94. Если файл не найден, или класс не существует после загрузки, то
  95. <code>Zend_Loader::loadClass()</code> бросает
  96. исключение <code>Zend_Exception</code>.
  97. </para>
  98. <para>
  99. Для загрузки используется метод
  100. <code>Zend_Loader::loadFile()</code>, поэтому имя класса должно
  101. содержать только алфавитно-цпфровые символы, тире ('-'), знак
  102. подчеркивания ('_') и точку ('.').
  103. </para>
  104. </sect2>
  105. <sect2 id="zend.loader.load.isreadable">
  106. <title>Проверка на возможность чтения из файла</title>
  107. <para>
  108. Статический метод <code>Zend_Loader::isReadable($pathname)</code>
  109. возвращает <constant>TRUE</constant>, если по заданному пути существует файл
  110. и он доступен для чтения, иначе возвращается <constant>FALSE</constant>.
  111. </para>
  112. <example id="zend.loader.load.isreadable.example">
  113. <title>Пример использования метода isReadable()</title>
  114. <programlisting language="php"><![CDATA[
  115. if (Zend_Loader::isReadable($filename)) {
  116. // делаем что-либо с файлом $filename
  117. }
  118. ]]></programlisting>
  119. </example>
  120. <para>
  121. Аргумент <varname>$filename</varname> задает имя файла для проверки. Он
  122. может содержать путь к файлу. Этот метод является оберкой к
  123. PHP-функции
  124. <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>.
  125. Метод <code>Zend_Loader::isReadable()</code> производит поиск в
  126. <code>include_path</code>, в то время как <code>is_readable()</code>
  127. этого не делает.
  128. </para>
  129. </sect2>
  130. <sect2 id="zend.loader.load.autoload">
  131. <title>Использование автозагрузчика</title>
  132. <para>
  133. Класс <classname>Zend_Loader</classname> содержит метод, который
  134. можно регистрировать
  135. через автозагрузчик PHP SPL. <code>Zend_Loader::autoload()</code>
  136. является методом обратного вызова. Для удобства
  137. <classname>Zend_Loader</classname> предоставляет метод
  138. <code>registerAutoload()</code> для регистрации
  139. его метода <code>autoload()</code>. Если в используемой среде
  140. PHP отсутствует расширение <code>spl_autoload</code>, то метод
  141. <code>registerAutoload()</code> бросает исключение
  142. <classname>Zend_Exception</classname>.
  143. </para>
  144. <example id="zend.loader.load.autoload.example">
  145. <title>Пример регистрации метода автозагрузки</title>
  146. <programlisting language="php"><![CDATA[
  147. Zend_Loader::registerAutoload();
  148. ]]></programlisting>
  149. </example>
  150. <para>
  151. После регистрации метода автозагрузки вы можете
  152. ссылаться на классы из Zend Framework без их явной загрузки.
  153. Метод <code>autoload()</code> автоматически запускает метод
  154. <code>Zend_Loader::loadClass()</code>, когда вы ссылаетесь на класс.
  155. </para>
  156. <para>
  157. Если вы расширили класс <classname>Zend_Loader</classname>, то
  158. можете передавать методу <code>registerAutoload()</code>
  159. опциональный аргумент для указания
  160. класса, из которого следует регистрировать метод
  161. <code>autoload()</code>.
  162. </para>
  163. <example id="zend.loader.load.autoload.example-extended">
  164. <title>Пример регистрации метода автозагрузки из расширенного класса</title>
  165. <para>
  166. В силу особенностей семантики статических функций в PHP
  167. вы должны реализовать код для обоих методов
  168. <code>loadClass()</code> и <code>autoload()</code>, при этом
  169. <code>autoload()</code> должен вызывать
  170. <code>self::loadClass()</code>. Если ваш метод
  171. <code>autoload()</code> делегирует родительскому классу вызов
  172. <code>self::loadClass()</code> то будет вызван метод
  173. родительского класса, не подкласса.
  174. </para>
  175. <programlisting language="php"><![CDATA[
  176. class My_Loader extends Zend_Loader
  177. {
  178. public static function loadClass($class, $dirs = null)
  179. {
  180. parent::loadClass($class, $dirs);
  181. }
  182. public static function autoload($class)
  183. {
  184. try {
  185. self::loadClass($class);
  186. return $class;
  187. } catch (Exception $e) {
  188. return false;
  189. }
  190. }
  191. }
  192. Zend_Loader::registerAutoload('My_Loader');
  193. ]]></programlisting>
  194. </example>
  195. <para>
  196. Регистрацию метода автозагрузки можно отменить.
  197. Метод <code>registerAutoload()</code> имеет опциональный
  198. второй аргумент, его значением по умолчанию является
  199. <constant>TRUE</constant>. Если этот аргумент равен <constant>FALSE</constant>,
  200. то данный метод автозагрузки удаляется из стека SPL.
  201. </para>
  202. </sect2>
  203. </sect1>
  204. <!--
  205. vim:se ts=4 sw=4 et:
  206. -->