Подтвердить что ты не робот

Автозагрузка 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(), но я не уверен, с какой целью. Активация автозагрузчиков с параметрами кажется, но точно, что это делает, я не уверен. Я предполагаю, что вторая запись массива указывает, где найти исходные файлы для пространства имен модулей - по крайней мере, это было бы моим предположением. Однако первая запись, о которой я, не знаю. В руководстве пользователя говорится следующее:

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

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

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