1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.loader.autoloader">
4 <title>Автозагрузчик</title>
7 <classname>Zend_Loader_Autoloader</classname> представляет собой
8 комплексное решение для автозагрузки. Он разрабатывался для следующих
14 Предоставление настоящего автозарузчика пространств имен
15 (предыдущие реализации перехватывали все пространства имен подряд).
19 Возможность регистрации любых обратных вызовов в качестве
20 автозагрузчиков и управления ими как стеком (на момент написания
21 данного текста он позволяет обойти некоторые проблемы с
22 <code>spl_autoload</code>,
23 которые не позволяют заново регистрировать обратные вызовы,
24 использующие методы экземпляра).
28 Возможность оптимистического сопоставления (optimistic matching)
29 пространств имен для более быстрого определения пути к подключаемому
35 <classname>Zend_Loader_Autoloader</classname> реализован в виде
36 синглетона, что делает его доступным из любого места.
37 Это дает возможность регистрировать дополнительные автозагрузчики
38 в любой момент выполнения, когда это необходимо.
41 <sect2 id="zend.loader.autoloader.usage">
42 <title>Использование автозагрузчика</title>
45 Когда экземпляр автозагрузчика извлекается в первый раз,
46 он регистрирует себя через <code>spl_autoload</code>.
47 Вы извлекаете экземпляр, используя метод <code>getInstance()</code>:
50 <programlisting language="php"><![CDATA[
51 $autoloader = Zend_Loader_Autoloader::getInstance();
55 По умолчанию автозагрузчик сконфигурирован с тем, чтобы
56 соответствовать пространствам имен "Zend_" и "ZendX_".
57 Если у вас есть есть своя библиотека, которая используют
58 собственное пространство имен, то вы можете зарегистрировать его
59 в автозагрузчике, используя метод <code>registerNamespace()</code>.
60 Например, если ваша библиотека представлена префиксом "My_", то вы
61 можете сделать это следующим образом:
64 <programlisting language="php"><![CDATA[
65 $autoloader->registerNamespace('My_');
69 <title>Префиксы пространств имен</title>
72 Обратите внимание, что предыдущий пример использует в
73 качестве префикса "My_", а не "My". Это из-за того, что
74 <classname>Zend_Loader_Autoloader</classname> задуман как
75 загрузчик общего назначения, и не предполагает,
76 что префикс пространства имен должен включать в себя знак
77 подчеркивания. Если ваше пространство имен классов
78 включает в себя знак подчеркивания, то вы должны указывать его
79 при регистрации вашего пространства имен.
84 Вы можете также регистрировать любые обратные вызовы для
85 автозагрузки, опционально с определенным пространством имен (или
86 группой пространств имен).
87 <classname>Zend_Loader_Autoloader</classname> будет искать
88 соответствие им до того, как использовать свой встроенный
89 механизм автозагрузки.
93 Например, вам можете захотеть использовать одну или более
94 компонент из eZcomponents в своем приложении на основе
95 Zend Framework. Для того, чтобы использовать возможности
96 eZcomponents по автозагрузке, добавьте его автозагрузчик в стек,
97 используя <code>pushAutoloader()</code>:
100 <programlisting language="php"><![CDATA[
101 $autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
105 Это говорит автозагрузчику, чтобы он использовал автозагрузчик
106 eZcomponents для классов, начинающихся с "ezc".
110 Вы можете использовать метод <code>unshiftAutoloader()</code>
111 для добавления автозагрузчика в начало цепочки автозагрузчиков.
115 По умолчанию <classname>Zend_Loader_Autoloader</classname> не
116 подавляет ошибки при использовании его внутреннего автозагрузчика,
117 который использует <classname>Zend_Loader::loadClass()</classname>.
118 В большинстве случаев это именно то, чего вы хотите.
119 Тем не менее, могут быть случаи, когда может потребоваться подавлять
120 их. Вы можете сделать это, используя метод
121 <code>suppressNotFoundWarnings()</code>:
124 <programlisting language="php"><![CDATA[
125 $autoloader->suppressNotFoundWarnings(true);
129 И наконец, иногда может потребоваться, чтобы автозагрузчик загружал
130 все пространства имен. Например, библиотеки PEAR не используют
131 общего пространства имен, что делает указание отдельных
132 пространств имен затруднительным, если используется много компонент
133 из PEAR. Вы можете использовать метод
134 <code>setFallbackAutoloader()</code>
135 для того, чтобы данный автозагрузчик был универсальным для всех
139 <programlisting language="php"><![CDATA[
140 $autoloader->setFallbackAutoloader(true);
144 <sect2 id="zend.loader.autoloader.interface">
145 <title>Итерфейс автозагрузчика</title>
148 Кроме возможности указывать любые обратные вызовы в качестве
149 автозагрузчиков, Zend Framework предоставляет интерфейс,
150 который классы автозагрузчиков могут реализовывать -
151 <classname>Zend_Loader_Autoloader_Interface</classname>:
154 <programlisting language="php"><![CDATA[
155 interface Zend_Loader_Autoloader_Interface
157 public function autoload($class);
162 Используя этот интерфейс, вы можете передавать экземпляр
163 класса методам <classname>Zend_Loader_Autoloader</classname>-а
164 <code>pushAutoloader()</code> и <code>unshiftAutoloader()</code>:
167 <programlisting language="php"><![CDATA[
168 // Предполагается, что Foo_Autoloader реализует Zend_Loader_Autoloader_Interface:
169 $foo = new Foo_Autoloader();
171 $autoloader->pushAutoloader($foo, 'Foo_');
175 <sect2 id="zend.loader.autoloader.reference">
176 <title>Справка по автозагрузчику</title>
179 Ниже приведено руководство по методам, доступным в классе
180 <classname>Zend_Loader_Autoloader</classname>.
183 <table id="zend.loader.autoloader.reference.api">
184 <title>Методы Zend_Loader_Autoloader-а</title>
189 <entry>Возвращаемое значение</entry>
190 <entry>Параметры</entry>
191 <entry>Описание</entry>
196 <entry><code>getInstance()</code></entry>
197 <entry><classname>Zend_Loader_Autoloader</classname></entry>
200 Возвращает экземпляр-синглетон класса
201 <classname>Zend_Loader_Autoloader</classname>.
202 При первом извлечении он регистрирует
203 себя через <code>spl_autoload</code>.
204 Этот метод является статическим.
209 <entry><code>resetInstance()</code></entry>
210 <entry><code>void</code></entry>
213 Устанавливает состояние экземпляра-синглетона
214 <classname>Zend_Loader_Autoloader</classname>
215 в его исходное состояние, отменяя регистрацию
216 всех обратных вызовов и всех зарегистрированных
222 <entry><code>autoload($class)</code></entry>
223 <entry><code>string|false</code></entry>
224 <entry><itemizedlist>
226 <varname>$class</varname>, <emphasis>обязательный</emphasis>.
227 Строка с именем класса для загрузки.
229 </itemizedlist></entry>
231 Пытается определить путь к файлу по имени класса
237 <entry><code>setDefaultAutoloader($callback)</code></entry>
238 <entry><classname>Zend_Loader_Autoloader</classname></entry>
239 <entry><itemizedlist>
241 <varname>$callback</varname>, <emphasis>обязательный</emphasis>.
243 </itemizedlist></entry>
245 Указывает альтернативный обратный вызов для
246 применения в используемой по умолчанию реализации
252 <entry><code>getDefaultAutoloader()</code></entry>
253 <entry><code>callback</code></entry>
256 Возвращает используемую по умолчанию реализацию
257 автозагрузчика; по умолчанию это
258 <classname>Zend_Loader::loadClass()</classname>.
263 <entry><code>setAutoloaders(array $autoloaders)</code></entry>
264 <entry><classname>Zend_Loader_Autoloader</classname></entry>
265 <entry><itemizedlist>
267 <varname>$autoloaders</varname>, <emphasis>обязательный</emphasis>.
269 </itemizedlist></entry>
271 Устанавливает список автозагрузчиков для
272 использования в стеке автозагрузчиков.
273 Каждый элемент в массиве автозагрузчиков должен быть
274 обратным вызовом PHP.
279 <entry><code>getAutoloaders()</code></entry>
280 <entry><type>Array</type></entry>
283 Возвращает внутренний стек автозагрузчиков.
288 <entry><code>getNamespaceAutoloaders($namespace)</code></entry>
289 <entry><type>Array</type></entry>
290 <entry><itemizedlist>
292 <varname>$namespace</varname>, <emphasis>обязательный</emphasis>
294 </itemizedlist></entry>
296 Извлекает все автозагрузчики, которые были
297 зарегистрированы для загрузки данного
303 <entry><code>registerNamespace($namespace)</code></entry>
304 <entry><classname>Zend_Loader_Autoloader</classname></entry>
305 <entry><itemizedlist>
307 <varname>$namespace</varname>, <emphasis>обязательный</emphasis>.
309 </itemizedlist></entry>
311 Регистрирует одно или более пространств имен с
312 используемым по умолчанию автозагрузчиком.
313 Если <varname>$namespace</varname> является строкой,
314 то она регистрируется как пространство имен;
315 если же массив строк, то все они
316 регистрируются как пространства имен.
321 <entry><code>unregisterNamespace($namespace)</code></entry>
322 <entry><classname>Zend_Loader_Autoloader</classname></entry>
323 <entry><itemizedlist>
325 <varname>$namespace</varname>, <emphasis>обязательный</emphasis>.
327 </itemizedlist></entry>
329 Отменяет регистрацию одного или более пространств
330 имен из используемого по умолчанию автозагрузчика.
331 Если <varname>$namespace</varname> является строкой,
332 то отменяется регистрация пространства имен
334 если это массив строк, то отменяются
335 регистрации всех пространств имен в этом массиве.
340 <entry><code>getRegisteredNamespace()</code></entry>
341 <entry><type>Array</type></entry>
344 Возвращает массив пространств имен,
345 зарегистрированных с используемым по умолчанию
351 <entry><code>suppressNotFoundWarnings($flag = null)</code></entry>
352 <entry><code>boolean|Zend_Loader_Autoloader</code></entry>
353 <entry><itemizedlist>
355 <varname>$flag</varname>, <emphasis>опциональный</emphasis>.
357 </itemizedlist></entry>
359 Устанавливает или возвращает значение флага,
360 который используется для указания того, должна ли
361 применяемая по умолчанию реализация автозагрузчика
362 подавлять предупреждение "файл не найден"
363 ("file not found"). Если ему не передаются аргументы
364 или передано значение null, то он возвращает
365 булево значение, показывающее статус флага.
366 Если же передано булево значение, то флаг
367 принимает данное значение и возвращается
368 экземпляр автозагрузчика (для возможности
369 использования method chaining).
374 <entry><code>setFallbackAutoloader($flag)</code></entry>
375 <entry><classname>Zend_Loader_Autoloader</classname></entry>
376 <entry><itemizedlist>
378 <varname>$flag</varname>, <emphasis>обязательный</emphasis>.
380 </itemizedlist></entry>
382 Устанавливает значение флага, который используется
383 для указания того, должен или нет применяемый по
384 умолчанию автозагрузчик использоваться в качестве
385 обратного вызова или универсального автозагрузчика
386 для всех пространств имен.
391 <entry><code>isFallbackAutoloader()</code></entry>
392 <entry><type>Boolean</type></entry>
395 Возвращает значение флага, который используется для
396 указания того, должен или нет применяемый по
397 умолчанию автозагрузчик использоваться в качестве
398 обратного вызова или универсального автозагрузчика
399 для всех пространств имен.
400 По умолчанию его значение равно false.
405 <entry><code>getClassAutoloaders($class)</code></entry>
406 <entry><type>Array</type></entry>
407 <entry><itemizedlist>
409 <varname>$class</varname>, <emphasis>обязательный</emphasis>.
411 </itemizedlist></entry>
413 Возвращает список автозагрузчиков, которые могут
414 соответствовать данному классу. Если нет ни одного
415 подходящего автозагрузчика, то возвращаются все
416 глобальные (без привязки к пространству имен)
422 <entry><code>unshiftAutoloader($callback, $namespace = '')</code></entry>
423 <entry><classname>Zend_Loader_Autoloader</classname></entry>
424 <entry><itemizedlist>
426 <varname>$callback</varname>, <emphasis>обязательный</emphasis>.
431 <varname>$namespace</varname>, <emphasis>опциональный</emphasis>.
432 Строка с префиксом имен классов, используемым в
433 качестве пространства имен.
435 </itemizedlist></entry>
437 Добавляет конкретную реализацию автозагрузчика
438 в начало внутреннего стека автозагрузчиков. Если
439 было передано пространство имен, то оно будет
440 использовано для оптимистического сопоставления
441 (optimistic matching), иначе автозагрузчик будет
442 использоваться в качестве глобального.
447 <entry><code>pushAutoloader($callback, $namespace = '')</code></entry>
448 <entry><classname>Zend_Loader_Autoloader</classname></entry>
449 <entry><itemizedlist>
451 <varname>$callback</varname>, <emphasis>обязательный</emphasis>.
456 <varname>$namespace</varname>, <emphasis>опциональный</emphasis>.
457 Строка с префиксом имен классов, используемым в
458 качестве пространства имен.
460 </itemizedlist></entry>
462 Добавляет конкретную реализацию автозагрузчика
463 в конец внутреннего стека автозагрузчиков. Если
464 было передано пространство имен, то оно будет
465 использовано для оптимистического сопоставления
466 (optimistic matching), иначе автозагрузчик будет
467 использоваться в качестве глобального.
472 <entry><code>removeAutoloader($callback, $namespace = '')</code></entry>
473 <entry><classname>Zend_Loader_Autoloader</classname></entry>
474 <entry><itemizedlist>
476 <varname>$callback</varname>, <emphasis>обязательный</emphasis>.
481 <varname>$namespace</varname>, <emphasis>опциональный</emphasis>.
482 Строка, представляющая собой префикс имен
483 классов (используемый в качестве пространства
484 имен) или массив строк с префиксами.
486 </itemizedlist></entry>
488 Удаляет конкретную реализацию автозагрузчика из
489 внутреннего стека автозагрузчиков.
490 Если предоставлено пространство (пространства) имен,
491 то обратный вызов будет удален только для данного
492 пространства (пространств) имен.