Zend Framework 2 автозагрузка

Я только начинаю смотреть на Zend Framework 2 (и я новичок в ZF в целом), и в руководстве пользователя они используют автозагрузку при добавлении нового модуля. Тем не менее, я считаю объяснение довольно сложным для новичка. Они добавляют Module.php файл в каталоге модуля, который среди прочего содержит следующий код:

public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

Теперь я немного покопался, чтобы попытаться выяснить, что это за автозагрузка. Насколько я понимаю, автозагрузка использует spl_autoload_register() и это способ избежать require_once() везде в коде. Таким образом, при попытке использовать класс, который не определен, autoload() Будет запущен зарегистрированный метод, который просто выполняет поиск в массиве и включает файл, как показано ниже, если он был добавлен.

// Zend/Loader/ClassMapAutoloader.php
public function autoload($class)
{
    if (isset($this->map[$class])) {
        require_once $this->map[$class];
    }
}

Это кажется умным из-за производительности. Я надеюсь, что я только что написал, правильно. Исходя из этого, я пытаюсь выяснить, что происходит в getAutoloaderConfig() из первого фрагмента кода, но я совсем запутался. Кажется, что массив, возвращаемый этим методом, используется для AutoloaderFactory::factory(), но я не уверен, с какой целью. Кажется, создание автозагрузчиков с опциями, но точно, что это делает, я не уверен. Я предполагаю, что вторая запись массива указывает, где найти исходные файлы для пространства имен модуля - по крайней мере, это было бы мое предположение. Первая запись, в которой я, однако, не уверен. В руководстве пользователя говорится следующее:

Поскольку мы находимся в разработке, нам не нужно загружать файлы через карту классов, поэтому мы предоставляем пустой массив для автозагрузчика карты классов.

Файл просто возвращает пустой массив. Я не уверен, какова цель этого ClassMapAutoloader.

Извините, если моя точка зрения неясна; в основном я пытаюсь выяснить, что происходит в getAutoloaderConfig() и что mymodule/autoload_classmap.php используется для. Если бы кто-то мог пролить свет на это, это было бы очень ценно!

3 ответа

Решение

Карта классов предназначена для того, чтобы показать PHP самый прямой путь к классу. По сути, это говорит: "Ты ищешь A\Class\Youre\Looking\Forсмотрите не дальше этого файла: xyz.php, Это будет выражаться так:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php'
)

Без этого PHP должен проходить через всю цепочку автозагрузчика, что может быть довольно дорого. Почему говорится что-то о "как мы в разработке"? Поскольку файлы карты классов обычно генерируются на производственном сервере некоторым сценарием. По сути, просто не беспокойтесь об этом сейчас. Это микрооптимизация...

getAutoloaderConfig() Метод только для того, чтобы дать вам некоторую гибкость в действительно продвинутых приложениях. В большинстве случаев вы можете просто использовать шаблонный код SkeletonApplication и SkeletonModule и оставить его в покое. На самом деле, вы можете даже убить 'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',) расстаться пока.

Это просто ловушка для будущих улучшений, и вам не о чем беспокоиться, если вы только начинаете работать с ZF2 (как я;).

ZF2 имеет несколько доступных автозагрузчиков.

2 наиболее распространенных (или 2, с которыми разработчики взаимодействуют напрямую, во всяком случае) Zend\Loader\ClassMapAutoloader а также Zend\Loader\StandardAutoloader,

  1. Автозагрузчик classmap обычно используется на уровне модулей, чтобы обеспечить простой, но быстрый механизм поиска в массиве. Он настроен с ассоциативным массивом key => value пары, с ключом, представляющим класс, и значением, представляющим имя файла, которое определяет класс.

  2. Стандартный автозагрузчик, с другой стороны, предназначен для хранения списка "пространств имен" и базовых каталогов. Что нужно сделать, это затем построить путь к классу, на который есть ссылка, но еще не загружен, добавив базовый путь к каталогу для этого пространства имен к имени класса, чтобы получить окончательный абсолютный путь к файлу класса, который он затем пытается сделать включают. Вы можете быстро заполнить файл classmap_autoload.php, выполнив/path/to/ZF2/bin/classmap_generator.php или же zftool.phar генерировать карту классов.

Zend\Loader\AutoloaderFactory Предназначен для управления различными автозагрузчиками и предотвращения конфликтов. В конечном счете, конечно, все возможности автозагрузки используют автозагрузку PHP SPL.

Цель getAutoloaderConfig() заключается в том, чтобы указать фабрике автозагрузчиков, какие автозагрузчики доступны для пространства имен этого модуля.

В приведенном выше примере это будет, в порядке предпочтения, автозагрузчик карты классов, за которым следует стандартный автозагрузчик. Если вы не хотите использовать автозагрузчик classmap для этого модуля, просто удалите ссылку из массива, возвращенного getAutoloaderConfig(),

Название метода getAutoloaderConfig() зарезервировано Если этот метод определен, в процессе инициализации модуля слушатель (Zend\ModuleManager\AutoloaderListener), который извлекает конфигурацию, возвращенную этим методом, и добавляет ее в консолидированную конфигурацию.

Веб-приложение состоит из множества классов PHP, и каждый класс обычно находится в отдельном файле. Это вводит необходимость включения файлов.

По мере того, как ваше приложение увеличивается в размере, может быть трудно включить каждый необходимый файл. Сам Zend Framework 2 состоит из сотен файлов, и может быть очень трудно загрузить всю библиотеку и все ее зависимости таким образом. Более того, при выполнении результирующего кода интерпретатору PHP потребуется процессорное время для обработки каждого включенного файла, даже если вы не создаете экземпляр его класса.

Чтобы исправить эту проблему, в PHP 5.1 была введена функция автозагрузки классов. Функция PHP spl_autoload_register() позволяет зарегистрировать функцию автозагрузчика. Для сложных веб-сайтов вы даже можете создать несколько функций автозагрузчика, которые объединены в стек.

Во время выполнения скрипта, если интерпретатор PHP встречает имя класса, которое еще не было определено, он по очереди вызывает все зарегистрированные функции автозагрузчика, пока либо функция автозагрузчика не включает в себя класс, либо не возникнет ошибка "not found". Это допускает "ленивую" загрузку, когда интерпретатор PHP обрабатывает определение класса только в момент вызова класса, когда это действительно необходимо.

Поскольку поставщик каждой библиотеки использует свои собственные соглашения об именах кодов и организации файлов, вам придется регистрировать различные пользовательские функции автозагрузчика для каждой зависимой библиотеки, что довольно раздражает (и на самом деле это ненужная работа). Чтобы решить эту проблему, был введен стандарт PSR-0.

Стандарт PSR-0(PSR означает Рекомендация по стандартам PHP) определяет рекомендуемую структуру кода, которой должно следовать приложение или библиотека, чтобы гарантировать совместимость автозагрузчика.

Каждый модуль веб-приложения регистрирует автозагрузчик, который позволяет автоматически загружать любой класс PHP в ваших модулях. Это сделано с getAutoloaderConfig() метод Module учебный класс.

ZF2 имеет специальный компонент с именем Zend\Loader, который содержит реализации двух обычно используемых классов автозагрузчика: стандартный автозагрузчик (Zend\Loader\StandardAutoloader) и автозагрузчик карты классов (Zend\Loader\ClassMapAutoloader).

Тот факт, что прикладные модули на основе ZF2 соответствуют стандарту PSR-0, позволяет использовать стандартный автозагрузчик.

Автозагрузчик карты классов может использоваться в качестве более быстрой замены стандартного автозагрузчика. Этот автозагрузчик ожидает, что вы передадите ему массив карты классов. Каждая пара ключ => значения карты классов - это, соответственно, имя класса и путь к файлу PHP, содержащему класс.

Концепция автозагрузки в Zend Framework 2 хорошо объяснена в книге " Использование Zend Framework 2".

Другие вопросы по тегам