2.3 Автозагрузка в Zend Framework. Основы использования автозагрузчика

Zend, “Autoloading in Zend Framework. Basic Autoloader Usage”, public translation into Russian from English More about this translation.

Translate into another language.

Теперь когда мы понимаем что такое автозагрузка, цели и архитектуру автозагрузки в 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 .

translatedby.com crowd

Like this translation? Share it or bookmark!