# Динамическая загрузка файлов и классов

Класс `Zend_Loader` включает в себя методы, помогающие производить динамическую загрузку файлов.

## Zend_Loader vs. require_once()

Методы `Zend_Loader` лучше всего использовать, когда имя файла для загрузки является переменным - например, если оно базируется на данных, введенных пользователем, или аргументе метода. Если вы загружаете файл или класс, чье имя является постоянным, то использование `Zend_Loader` не дает каких-либо преимуществ по сравнению использованием обычных функций PHP, таких, как `require_once()`.

## Загрузка файлов

Статический метод `Zend_Loader::loadFile()` загружает файл PHP. Загружаемый файл должен содержать код PHP. Метод является оберткой к PHP-функции `include()`. Этот метод возвращает `FALSE` в случае неуспеха - например, если требуемый файл не существует.

### Пример использования метода loadFile()

    Zend_Loader::loadFile($filename, $dirs=null, $once=false);

Аргумент `$filename` задает имя файла для загрузки, он не должен содержать путь к файлу. В целях безопасности производится проверка `$filename`. `$filename` должен содержать только алфавитно-цифровые символы, тире ("-"), знак подчеркивания ("_") и точку ("."). На аргумент `$dirs` эти ограничения не распространяются.

Аргумент `$dirs` задает директории, в которых должен производиться поиск файла. Если его значение равно `NULL`, то для поиска используется только `include_path`. Если его значение является строкой или массивом, то файл сначала ищется в данной директории (директориях), а затем в `include_path`.

Аргумент `$once` является значением булевого типа. Если равен `TRUE`, то `Zend_Loader::loadFile()` для загрузки файла использует PHP-функцию `include_once()`, иначе используется функция `include()`.

## Загрузка классов

Статический метод `Zend_Loader::loadClass($class, $dirs)` загружает файл PHP и затем проверяет наличие требуемого класса.

### Пример использования метода loadClass()

    Zend_Loader::loadClass('Container_Tree',
        array(
            '/home/production/mylib',
            '/home/production/myapp'
        )
    );

Строка, задающая класс, преобразуется в относительный путь посредством замены знаков подчеркивания разделителями директорий, используемыми в вашей ОС, и добавления расширения '.php'. В примере выше на Windows будет использоваться путь 'Container\\Tree.php'.

Если `$dirs` является строкой или массивом, то `Zend_Loader::loadClass()` ищет в директориях в том порядке, в котором они были определены. Загружается первый найденный файл. Если файл не найден в директориях `$dirs`, то производится поиск в `include_path`.

Если файл не найден, или класс не существует после загрузки, то `Zend_Loader::loadClass()` бросает исключение `Zend_Exception`.

Для загрузки используется метод `Zend_Loader::loadFile()`, поэтому имя класса должно содержать только алфавитно-цпфровые символы, тире ('-'), знак подчеркивания ('_') и точку ('.').

## Проверка на возможность чтения из файла

Статический метод `Zend_Loader::isReadable($pathname)` возвращает `TRUE`, если по заданному пути существует файл и он доступен для чтения, иначе возвращается `FALSE`.

### Пример использования метода isReadable()

    if (Zend_Loader::isReadable($filename)) {
        // делаем что-либо с файлом $filename
    }

Аргумент `$filename` задает имя файла для проверки. Он может содержать путь к файлу. Этот метод является оберкой к PHP-функции `is_readable()`. Метод `Zend_Loader::isReadable()` производит поиск в `include_path`, в то время как `is_readable()` этого не делает.

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

Класс `Zend_Loader` содержит метод, который можно регистрировать через автозагрузчик PHP SPL. `Zend_Loader::autoload()` является методом обратного вызова. Для удобства `Zend_Loader` предоставляет метод `registerAutoload()` для регистрации его метода `autoload()`. Если в используемой среде PHP отсутствует расширение `spl_autoload`, то метод `registerAutoload()` бросает исключение `Zend_Exception`.

### Пример регистрации метода автозагрузки

    Zend_Loader::registerAutoload();

После регистрации метода автозагрузки вы можете ссылаться на классы из Zend Framework без их явной загрузки. Метод `autoload()` автоматически запускает метод `Zend_Loader::loadClass()`, когда вы ссылаетесь на класс.

Если вы расширили класс `Zend_Loader`, то можете передавать методу `registerAutoload()` опциональный аргумент для указания класса, из которого следует регистрировать метод `autoload()`.

### Пример регистрации метода автозагрузки из расширенного класса

В силу особенностей семантики статических функций в PHP вы должны реализовать код для обоих методов `loadClass()` и `autoload()`, при этом `autoload()` должен вызывать `self::loadClass()`. Если ваш метод `autoload()` делегирует родительскому классу вызов `self::loadClass()` то будет вызван метод родительского класса, не подкласса.

    class My_Loader extends Zend_Loader
    {
        public static function loadClass($class, $dirs = null)
        {
            parent::loadClass($class, $dirs);
        }

        public static function autoload($class)
        {
            try {
                self::loadClass($class);
                return $class;
            } catch (Exception $e) {
                return false;
            }
        }
    }

    Zend_Loader::registerAutoload('My_Loader');

Регистрацию метода автозагрузки можно отменить. Метод `registerAutoload()` имеет опциональный второй аргумент, его значением по умолчанию является `TRUE`. Если этот аргумент равен `FALSE`, то данный метод автозагрузки удаляется из стека SPL.