Отличается ли автозагрузчик для фреймворка и обычной библиотеки - PullRequest
0 голосов
/ 05 июня 2011

В соответствии с предложением PCR-0 все, что требуется автозагрузчику, - это функция автозагрузки ().У Zend есть несколько автозагрузочных классов

Zend_Loader()
Zend_Loader_Autoloader()
Zend_Loader_Autoloader_Resource()
Zend_Loader_Autoloader_Interface()

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

У меня есть библиотека (обычная библиотека, а не фреймворк).Сейчас у него нет автозагрузчика, поэтому я использую Zend_Loader_Autoloader_Resource -> addResourceType ().Если я напишу для него автозагрузчик, какой автозагрузчик будет использоваться: Zend's или библиотека?и должен ли я реализовать автозагрузчик, такой же сложный, как Zend, или такой простой, как пример PCR-0.

Что происходит в этих случаях

  • и у фреймворка, и у библиотеки есть свои собственныеавтозагрузчик
  • Framework имеет автозагрузчик, но библиотека не
  • Framework не имеет автозагрузчика, а библиотека имеет

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Я бы предложил придерживаться прямого сопоставления пути-> класса и реализовать свой собственный автозагрузчик следующим образом:

class MyLib_Autoloader
{
    public function __construct() {
        spl_autoload_register(array($this, 'autoload'));
    }
    public function autoload($className)
    {
        if (substr($className, 0, 6) == 'MyLib_') {
            include dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR strtr($className, '_', DIRECTORY_SEPARATOR) . '.php';
            return true;
        } 
        return false;
    }
}

Это проверит, принадлежит ли класс вашему пространству имен, и загрузит файл. Предполагается, что ваш автозагрузчик находится в / some / path / MyLib / -> путь включения будет /some/path/MyLib/../MyLib/ClassName.php. Вы также можете добавить больше логики, чтобы убрать начальную MyLib из имени класса и избавиться от этого '..'.

Обязательно используйте только require. Это быстрее, и функция автозагрузки вызывается не более одного раза для каждого имени класса! :) Не нужно включать include_once / require_once / etc. Иди с самым быстрым.

Использование так же просто, как:

include '/some/path/MyLib/Autploader.php';
$loader = new MyLib_Autoloader();
1 голос
/ 05 июня 2011

Главный вопрос: кто / как будет использовать вашу библиотеку?

Если это только у вас, тогда используйте автозагрузчик Zend, это сэкономит ваше время. Вам не нужно изобретать велосипед.

Если вам нужно сделать вашу библиотеку общедоступной и использовать ее в разных проектах, то это может быть проблемой, поскольку она заставит пользователей вашей библиотеки также использовать Zend Framework. Так что в этом случае либо вы создаете свой собственный автозагрузчик, либо выбираете один из фреймворков / библиотек, но включаете его в свою библиотеку (следите за лицензиями).

Теперь по поводу использования автозагрузчиков: будут вызываться только зарегистрированные автозагрузчики. Если у вас есть собственный автозагрузчик, но вы не упомянули, как настроить его в своей документации, пользователи вашего кода никогда не будут думать о его настройке, и тогда он не будет использоваться.

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

...