2012-09-13 7 views
12

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

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. Если бы кто-то мог пролить свет на это, это было бы высоко оценено!

+8

Zend настолько переработан, что его смешно. – wesside

+1

Абсолютно. Но я думаю, что если вы найдете свой путь вокруг, это действительно очень мощный. Как Magento. –

+0

Я использую его на работе, у него есть взлеты и падения. Я предпочитаю Кохану, хотя и использую любые библиотеки Zend, которые мне могут понадобиться. Извините @ andy124, еще не использовали 2, извините, чтобы угнать ваш вопрос. – wesside

ответ

21

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

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

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

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

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

+0

Спасибо. То, что вы написали о ClassMapAutoloader, имеет смысл в вашем примере, но я не уверен, почему ключ в массиве - 'Zend \ Loader \ ClassMapAutoloader'. Значение относится к файлу PHP, который даже не является классом; он просто возвращает массив.Я предполагаю, что он говорит «ClassMapAutoloader» искать в этом файле конфигурацию карты классов. Не то, что я буду использовать его прямо сейчас, но является ли целью 'autoload_classmap.php', чтобы просто вернуть массив имен классов в качестве ключа и пути как значение? Насколько я понимаю из вашего ответа, это не обязательно, а просто оптимизация. – Andy0708

+1

Zend \ Loader \ ClassMapAutoloader - это класс. См. Https://github.com/zendframework/zf2/blob/master/library/Zend/Loader/ClassMapAutoloader.php Итак, он говорит: «Используйте ClassMapAutoloader и дайте ему файл autoload_classmap.php в качестве параметра». Затем автозагрузчик использует возвращенный массив из этого файла для сопоставления классов определенным файлам. Это немного яснее? –

8

В 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 сгенерируйте classmap.

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

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

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

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

+0

+1 Очень четкое и простое объяснение. – Andy0708

3

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

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

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

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

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

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

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

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

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

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

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