# Автозагрузчик

Zend_Loader_Autoloader представляет собой комплексное решение для автозагрузки. Он разрабатывался для следующих целей:

- Предоставление настоящего автозарузчика пространств имен (предыдущие реализации перехватывали все пространства имен подряд).

- Возможность регистрации любых обратных вызовов в качестве автозагрузчиков и управления ими как стеком (на момент написания данного текста он позволяет обойти некоторые проблемы с `spl_autoload`, которые не позволяют заново регистрировать обратные вызовы, использующие методы экземпляра).

- Возможность оптимистического сопоставления (optimistic matching) пространств имен для более быстрого определения пути к подключаемому классу.

Zend_Loader_Autoloader реализован в виде синглетона, что делает его доступным из любого места. Это дает возможность регистрировать дополнительные автозагрузчики в любой момент выполнения, когда это необходимо.

## Использование автозагрузчика

Когда экземпляр автозагрузчика извлекается в первый раз, он регистрирует себя через `spl_autoload`. Вы извлекаете экземпляр, используя метод `getInstance()`:

    $autoloader = Zend_Loader_Autoloader::getInstance();

По умолчанию автозагрузчик сконфигурирован с тем, чтобы соответствовать пространствам имен "Zend_" и "ZendX_". Если у вас есть есть своя библиотека, которая используют собственное пространство имен, то вы можете зарегистрировать его в автозагрузчике, используя метод `registerNamespace()`. Например, если ваша библиотека представлена префиксом "My_", то вы можете сделать это следующим образом:

    $autoloader->registerNamespace('My_');

Префиксы пространств имен

Обратите внимание, что предыдущий пример использует в качестве префикса "My_", а не "My". Это из-за того, что Zend_Loader_Autoloader задуман как загрузчик общего назначения, и не предполагает, что префикс пространства имен должен включать в себя знак подчеркивания. Если ваше пространство имен классов включает в себя знак подчеркивания, то вы должны указывать его при регистрации вашего пространства имен.

Вы можете также регистрировать любые обратные вызовы для автозагрузки, опционально с определенным пространством имен (или группой пространств имен). Zend_Loader_Autoloader будет искать соответствие им до того, как использовать свой встроенный механизм автозагрузки.

Например, вам можете захотеть использовать одну или более компонент из eZcomponents в своем приложении на основе Zend Framework. Для того, чтобы использовать возможности eZcomponents по автозагрузке, добавьте его автозагрузчик в стек, используя `pushAutoloader()`:

    $autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');

Это говорит автозагрузчику, чтобы он использовал автозагрузчик eZcomponents для классов, начинающихся с "ezc".

Вы можете использовать метод `unshiftAutoloader()` для добавления автозагрузчика в начало цепочки автозагрузчиков.

По умолчанию Zend_Loader_Autoloader не подавляет ошибки при использовании его внутреннего автозагрузчика, который использует Zend_Loader::loadClass(). В большинстве случаев это именно то, чего вы хотите. Тем не менее, могут быть случаи, когда может потребоваться подавлять их. Вы можете сделать это, используя метод `suppressNotFoundWarnings()`:

    $autoloader->suppressNotFoundWarnings(true);

И наконец, иногда может потребоваться, чтобы автозагрузчик загружал все пространства имен. Например, библиотеки PEAR не используют общего пространства имен, что делает указание отдельных пространств имен затруднительным, если используется много компонент из PEAR. Вы можете использовать метод `setFallbackAutoloader()` для того, чтобы данный автозагрузчик был универсальным для всех пространств имен:

    $autoloader->setFallbackAutoloader(true);

## Итерфейс автозагрузчика

Кроме возможности указывать любые обратные вызовы в качестве автозагрузчиков, Zend Framework предоставляет интерфейс, который классы автозагрузчиков могут реализовывать - Zend_Loader_Autoloader_Interface:

    interface Zend_Loader_Autoloader_Interface
    {
        public function autoload($class);
    }

Используя этот интерфейс, вы можете передавать экземпляр класса методам Zend_Loader_Autoloader-а `pushAutoloader()` и `unshiftAutoloader()`:

    // Предполагается, что Foo_Autoloader реализует Zend_Loader_Autoloader_Interface:
    $foo = new Foo_Autoloader();

    $autoloader->pushAutoloader($foo, 'Foo_');

## Справка по автозагрузчику

Ниже приведено руководство по методам, доступным в классе Zend_Loader_Autoloader.

Методы Zend_Loader_Autoloader-а

Метод | Возвращаемое значение | Параметры | Описание
--- | --- | --- | ---
`getInstance()` | Zend_Loader_Autoloader | Нет | Возвращает экземпляр-синглетон класса Zend_Loader_Autoloader. При первом извлечении он регистрирует себя через `spl_autoload`. Этот метод является статическим.
`resetInstance()` | `void` | Нет | Устанавливает состояние экземпляра-синглетона Zend_Loader_Autoloader в его исходное состояние, отменяя регистрацию всех обратных вызовов и всех зарегистрированных пространств имен.
`autoload($class)` | `string|false` | `$class`, обязательный. Строка с именем класса для загрузки. | Пытается определить путь к файлу по имени класса и загрузить его.
`setDefaultAutoloader($callback)` | Zend_Loader_Autoloader | `$callback`, обязательный. | Указывает альтернативный обратный вызов для применения в используемой по умолчанию реализации автозагрузчика.
`getDefaultAutoloader()` | `callback` | Нет | Возвращает используемую по умолчанию реализацию автозагрузчика; по умолчанию это Zend_Loader::loadClass().
`setAutoloaders(array $autoloaders)` | Zend_Loader_Autoloader | `$autoloaders`, обязательный. | Устанавливает список автозагрузчиков для использования в стеке автозагрузчиков. Каждый элемент в массиве автозагрузчиков должен быть обратным вызовом PHP.
`getAutoloaders()` | Array | Нет | Возвращает внутренний стек автозагрузчиков.
`getNamespaceAutoloaders($namespace)` | Array | `$namespace`, обязательный | Извлекает все автозагрузчики, которые были зарегистрированы для загрузки данного пространства имен.
`registerNamespace($namespace)` | Zend_Loader_Autoloader | `$namespace`, обязательный. | Регистрирует одно или более пространств имен с используемым по умолчанию автозагрузчиком. Если `$namespace` является строкой, то она регистрируется как пространство имен; если же массив строк, то все они регистрируются как пространства имен.
`unregisterNamespace($namespace)` | Zend_Loader_Autoloader | `$namespace`, обязательный. | Отменяет регистрацию одного или более пространств имен из используемого по умолчанию автозагрузчика. Если `$namespace` является строкой, то отменяется регистрация пространства имен под этим именем; если это массив строк, то отменяются регистрации всех пространств имен в этом массиве.
`getRegisteredNamespace()` | Array | Нет | Возвращает массив пространств имен, зарегистрированных с используемым по умолчанию автозагрузчиком.
`suppressNotFoundWarnings($flag = null)` | `boolean|Zend_Loader_Autoloader` | `$flag`, опциональный. | Устанавливает или возвращает значение флага, который используется для указания того, должна ли применяемая по умолчанию реализация автозагрузчика подавлять предупреждение "файл не найден" ("file not found"). Если ему не передаются аргументы или передано значение null, то он возвращает булево значение, показывающее статус флага. Если же передано булево значение, то флаг принимает данное значение и возвращается экземпляр автозагрузчика (для возможности использования method chaining).
`setFallbackAutoloader($flag)` | Zend_Loader_Autoloader | `$flag`, обязательный. | Устанавливает значение флага, который используется для указания того, должен или нет применяемый по умолчанию автозагрузчик использоваться в качестве обратного вызова или универсального автозагрузчика для всех пространств имен.
`isFallbackAutoloader()` | Boolean | Нет | Возвращает значение флага, который используется для указания того, должен или нет применяемый по умолчанию автозагрузчик использоваться в качестве обратного вызова или универсального автозагрузчика для всех пространств имен. По умолчанию его значение равно false.
`getClassAutoloaders($class)` | Array | `$class`, обязательный. | Возвращает список автозагрузчиков, которые могут соответствовать данному классу. Если нет ни одного подходящего автозагрузчика, то возвращаются все глобальные (без привязки к пространству имен) автозагрузчики.
`unshiftAutoloader($callback, $namespace = '')` | Zend_Loader_Autoloader | `$callback`, обязательный. Обратный вызов PHP `$namespace`, опциональный. Строка с префиксом имен классов, используемым в качестве пространства имен. | Добавляет конкретную реализацию автозагрузчика в начало внутреннего стека автозагрузчиков. Если было передано пространство имен, то оно будет использовано для оптимистического сопоставления (optimistic matching), иначе автозагрузчик будет использоваться в качестве глобального.
`pushAutoloader($callback, $namespace = '')` | Zend_Loader_Autoloader | `$callback`, обязательный. Обратный вызов PHP `$namespace`, опциональный. Строка с префиксом имен классов, используемым в качестве пространства имен. | Добавляет конкретную реализацию автозагрузчика в конец внутреннего стека автозагрузчиков. Если было передано пространство имен, то оно будет использовано для оптимистического сопоставления (optimistic matching), иначе автозагрузчик будет использоваться в качестве глобального.
`removeAutoloader($callback, $namespace = '')` | Zend_Loader_Autoloader | `$callback`, обязательный. Обратный вызов PHP `$namespace`, опциональный. Строка, представляющая собой префикс имен классов (используемый в качестве пространства имен) или массив строк с префиксами. | Удаляет конкретную реализацию автозагрузчика из внутреннего стека автозагрузчиков. Если предоставлено пространство (пространства) имен, то обратный вызов будет удален только для данного пространства (пространств) имен.