Programmer's Reference Guide
| Zend_Loader |
Динамическая загрузка файлов и классов
Класс Zend_Loader включает в себя методы, помогающие производить динамическую загрузку файлов.
Zend_Loader vs. require_once()
Методы Zend_Loader лучше всего использовать,
когда имя файла для загрузки является переменным - например,
если оно базируется на данных, введенных пользователем,
или аргументе метода.
Если вы загружаете файл или класс, чье имя является постоянным,
то использование Zend_Loader
не дает каких-либо преимуществ по сравнению использованием обычных
функций PHP, таких, как
» require_once().
Загрузка файлов
Статический метод Zend_Loader::loadFile() загружает
файл PHP. Загружаемый файл должен содержать код PHP. Метод является
оберткой к PHP-функции
» include().
Этот метод возвращает FALSE в случае
неуспеха - например, если требуемый файл не существует.
Пример #1 Пример использования метода 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 и затем проверяет наличие требуемого класса.
Пример #2 Пример использования метода loadClass()
- Zend_Loader::loadClass('Container_Tree',
- '/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.
Пример #3 Пример использования метода 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.
Пример #4 Пример регистрации метода автозагрузки
- Zend_Loader::registerAutoload();
После регистрации метода автозагрузки вы можете
ссылаться на классы из Zend Framework без их явной загрузки.
Метод autoload() автоматически запускает метод
Zend_Loader::loadClass(), когда вы ссылаетесь на класс.
Если вы расширили класс Zend_Loader, то
можете передавать методу registerAutoload()
опциональный аргумент для указания
класса, из которого следует регистрировать метод
autoload().
Пример #5 Пример регистрации метода автозагрузки из расширенного класса
В силу особенностей семантики статических функций в PHP
вы должны реализовать код для обоих методов
loadClass() и autoload(), при этом
autoload() должен вызывать
self::loadClass(). Если ваш метод
autoload() делегирует родительскому классу вызов
self::loadClass() то будет вызван метод
родительского класса, не подкласса.
- class My_Loader extends Zend_Loader
- {
- {
- parent::loadClass($class, $dirs);
- }
- {
- try {
- self::loadClass($class);
- return $class;
- } catch (Exception $e) {
- return false;
- }
- }
- }
- Zend_Loader::registerAutoload('My_Loader');
Регистрацию метода автозагрузки можно отменить.
Метод registerAutoload() имеет опциональный
второй аргумент, его значением по умолчанию является
TRUE. Если этот аргумент равен FALSE,
то данный метод автозагрузки удаляется из стека SPL.
| Zend_Loader |
