(Yaf >=1.0.0)
Yaf_Loader представляет комплексное решение для автозагрузки для Yaf.
При первом извлечении экземпляра Yaf_Application, Yaf_Loader создаёт экземпляр-одиночку и регистрируется с помощью spl_autoload. Вы извлекаете экземпляр, используя Yaf_Loader::getInstance()
Yaf_Loader попытается загрузить класс только один раз, в случае
возникновения ошибки, зависит от yaf.use_spl_auload, если эта
конфигурация включена Yaf_Loader::autoload() вернёт
false
, таким образом предоставляя возможность другой функции автозагрузки. Если выключена
(по умолчанию), Yaf_Loader::autoload() вернёт
true
, а также сработает очень полезное предупреждение
(полезно, чтобы выяснить, почему класс не может быть загружен).
Замечание:
Пожалуйста, оставьте yaf.use_spl_autoload выключенным, если в какой-то библиотеке нет собственного механизма автозагрузки и его невозможно переписать.
По умолчанию Yaf_Loader предполагает, что вся библиотека (сценарий, определённый классом) хранится в каталоге глобальной библиотеки, который определён в php.ini (yaf.library).
Если вы хотите с помощью Yaf_Loader выполнить поиск некоторых классов (библиотек) в каталоге локальных классов (который определён в application.ini, по умолчанию это application.directory. "/library"), вы должны зарегистрировать префикс класса, используя Yaf_Loader::registerLocalNameSpace()
Давайте посмотрим несколько примеров (при условии, что APPLICATION_PATH application.directory):
Пример #1 Пример конфигурации
// Предполагаются следующие настройки в php.ini: yaf.library = "/global_dir" //Предполагаются следующие настройки в php.ini: application.library = APPLICATION_PATH "/library"
Пример #2 Зарегистрировать локальное пространство имён
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
?>
Пример #3 Пример загрузки класса
class Foo_Bar_Test => // APPLICATION_PATH/library/Foo/Bar/Test.php class GLO_Name => // /global_dir/Glo/Name.php class BarNon_Test // /global_dir/Barnon/Test.php
Пример #4 Пример загрузки класса имён
class \Foo\Bar\Dummy => // APPLICATION_PATH/library/Foo/Bar/Dummy.php class \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php
Вы можете заметить, что все папки с первой буквой заглавными, вы можете сделать их строчными, установив yaf.lowcase_path = On в php.ini.
Yaf_Loader также предназначен для загрузки классов MVC, и правило таково:
Пример #5 Пример загрузки класса MVC
Controller Classes => // APPLICATION_PATH/controllers/ Model Classes => // APPLICATION_PATH/models/ Plugin Classes => // APPLICATION_PATH/plugins/
Пример #6 Классовые различия MVC
Controller Classes => // ***Controller Model Classes => // ***Model Plugin Classes => // ***Plugin
Пример #7 Пример загрузки MVC
class IndexController // APPLICATION_PATH/controllers/Index.php class DataModel => // APPLICATION_PATH/models/Data.php class DummyPlugin => // APPLICATION_PATH/plugins/Dummy.php class A_B_TestModel => // APPLICATION_PATH/models/A/B/Test.php
также на каталог будет влиять yaf.lowcase_path.Замечание:
Начиная с 2.1.18, Yaf поддерживает автозагрузку контроллеров для стороны пользовательского скрипта (что означает автозагрузку, запускаемую пользовательским скриптом php, например: доступ к статическому свойству контроллера в Bootstrap или плагинах), но автозагрузчик только пытается найти скрипт класса контроллера в папке модуля по умолчанию, которая называется "APPLICATION_PATH/controllers/".
По умолчанию это значение равно application.directory . "/library", вы можете изменить это либо в application.ini(application.library), либо вызвать Yaf_Loader::setLibraryPath()