2.3 Автозагрузка в Zend Framework. Основы использования автозагрузчика |
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translation complete.
Теперь когда мы понимаем что такое автозагрузка, цели и архитектуру автозагрузки в Zend Framework, давайте посмотрим как использовать Zend_Loader_Autoloader.
В простейшем случае, вы просто подключаете класс и создаете его экземпляр. Так как Zend_Loader_Autoloader это синглтон (singleton) (вледствии того, что автозагрузчик SPL являеться единственным ресурсом), мы используем getInstance() для получения экземпляра.
01. require_once 'Zend/Loader/Autoloader.php';
02. Zend_Loader_Autoloader::getInstance();
По умолчанию, это позволяет загружать классы с префиксом пространства имен "Zend_" или "ZendX_", пока они в вашем include_path.
Что случиться если вы захотите использовать другие префиксы пространств имен? Наилучший и простейший путь это вызвать метод registerNamespace() у этого экземпляра. Вы можете передать один префикс пространства имен, или массив префиксов:
01. require_once 'Zend/Loader/Autoloader.php';
02. $loader = Zend_Loader_Autoloader::getInstance();
03. $loader->registerNamespace('Foo_');
04. $loader->registerNamespace(array('Foo_', 'Bar_'));
Кроме того, вы можете указать Zend_Loader_Autoloader работать в качестве "запасного" автозагрузчика. Это означает, что он бeдет пытаться найти любой класс не обращая внимания на префикс пространства имен.
01. $loader->setFallbackAutoloader(true);
Внимание
Не используйте автозагрузчик в качестве запасного
Хотя и возможно использовать Zend_Loader_Autoloader в качестве запасного автозагрузчика, мы не рекомендуем этого делать.
Внутри, Zend_Loader_Autoloader использует Zend_Loader::loadClass() для загрузки классов. Этот метод использует include() для попытки загрузки указанного файла класса. include() вернет булево FALSE в случае неудачи -- но также выдаст PHP предупреждение. Это может усложнить некоторые вопросы:
• Если включено display_errors, предупреждения будут отображаться на экране.
• В зависимости от настройки уровня error_reporting, выбранной вами, это также может засорить ваши логи.
Вы можете подавить сообщения об ошибках (детальней об этом в документации Zend_Loader_Autoloader), но имейте ввиду, подавление имеет смысл только когда display_errors включен; лог ошибок всегда будет отображать сообщения. По этой причине, мы рекомендуем всегда конфигурировать префиксы пространства имен так, что бы автозагрузчик знал о них.
Замечание: Не путайте префиксы пространств имен Zend Framework с пространствами имен PHP
Уже после того как это было написано, вышел релиз PHP 5.3. Теперь, начиная с этой версии, PHP оффициально поддерживает пространства имен.
Однако, Zend Framework предшествовал PHP 5.3, и соответственно пространству имен. В рамках Zend Framework, когда мы говорим о "пространстве имен", мы имеем ввиду практику, согласно которой к классам добавляються префиксы с "пространством имен" поставщиков. Например, все имена классов Zend Framework используют префикс "Zend_" -- это наше "пространство имени" как поставщика.
Zend Framework планирует предложить "родную" поддержку пространств имен PHP в будущих версиях, а наши библиотеки будут его использовать начиная с версии 2.0.0.
Если вы хотите использовать свой собственный автозагрузчик совместно с Zend Framework (например, это может быть автозагрузчик сторонних библиотек), вы все так же можете управлять им при помощи методов pushAutoloader() и unshiftAutoloader() класса Zend_Loader_Autoloader. Эти методы добавляют автозагрузчик, соответственно, в конец или в начало цепочки автозагрузчиков, которая вызывается непосредственно перед срабатыванием внутреннего механизма автозагрузки Zend Framework. Данный принцип имеет следующие преимущества:
• Каждый метод принимает префикс пространства имен в качестве второго, необязательного параметра. Этот префикс может использоваться для того, чтобы указать, что заданный автозагрузчик будет вызываться только для классов, которые содержат данный префикс. Если же в процессе обработки будет установлено, что имя класса не содержит указанного префикса пространства имен, то соответствующий автозагрузчик будет проигнорирован.
• В случае необходимости в манипуляциях с реестром spl_autoload() могут возникнуть проблемы, так как spl_autoload_functions() возвращают измененные экземпляры функций обратного вызова. Zend_Loader_Autoloader не имеет подобных ограничений.
В качестве автозагрузчиков, используемых данным образом, могут применяться любые функции обратного вызова PHP.
01. // Добавляем функцию 'my_autoloader' в стек
02. // для обработки классов с префиксом 'My_':
03. $loader->pushAutoloader('my_autoloader', 'My_');
04.
05. // Добавляем статический метод Foo_Loader::autoload() в начало стека
06. // для обработки классов с префиксом 'Foo_':
07. $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');
Original (English): Autoloading in Zend Framework. Basic Autoloader Usage
Translation: © antdmi, Victor Gryshko, kennobi .
