Содержание
Класс Zend_Loader включает в себя методы, помогающие производить динамическую загрузку файлов.
Zend_Loader vs. require_once() | |
---|---|
Методы Zend_Loader лучше всего использовать, если имя файла,
которого нужно загрузить, является переменным - например, основано
на вводе пользователя или аргументе метода. Если вы загружаете файл
или класс, чье имя является константой, то использование Zend_Loader
не дает каких-либо преимуществ по сравнению использованием обычных
функций PHP, таких, как
|
Статический метод 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()
.
Статический метод 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()
, поэтому имя класса должно
содержать только алфавитно-цпфровые символы, тире ('-'), знак
подчеркивания ('_') и точку ('.').
Статический метод 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()
производит.
Класс 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()
.