Глава 17. Zend_Loader

Содержание

17.1. Динамическая загрузка файлов и классов
17.1.1. Загрузка файлов
17.1.2. Загрузка классов
17.1.3. Проверка, является ли файл доступным для чтения
17.1.4. Использование автозагрузчика

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

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

[Подсказка] Zend_Loader vs. require_once()

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

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

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

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

<?php

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().

17.1.2. Загрузка классов

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

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

<?php

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

?>

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

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

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

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

17.1.3. Проверка, является ли файл доступным для чтения

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

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

<?php

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

?>

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

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

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

Пример 17.4. Пример регистрации метода обратного вызова автозагрузки

<?php

Zend_Loader::registerAutoload();

?>

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

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

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

<?php

class My_Loader extends Zend_Loader
{
    // реализация собственного функционала
}

Zend_Loader::registerAutoload('My_Loader');

?>