require vs autoload

sverel

Новичок
Постоянно в сторонних библиотеках вижу require 'some/class.php', но не понимаю: зачем это нужно, когда есть autoload?

Любая серьёзная библиотека (тем более фреймворк) может правильно именовать файлы и раскидывать их по папкам, что бы они автоматически подключались:
PHP:
myAutoload($className)
{
   $path = str_replace('_', '/', $className);
}
Вчера подключил к своему сайту PHPExcel и там точно такая же ф-ция. Наши с ним ф-ции автолоада работают последовательно. Всё получается максимально правильно, ведь классы подключаются "по требованию".
Но в большинстве сторонних библиотек я встречаю либо подключение классов "всегда вначале скрипта/функции" - что само по себе избыточно:
PHP:
function someFunc($x)
{
   require_once 'lib/config/exception.php';
   
   if ($x === 100) {
        throw new config_exception();
   }
}
Или дублирование кода:
PHP:
if (...) {
    require_once 'lib/config/exception.php';
    ....
} elseif (....) {
    require_once 'lib/config/exception.php';
} else {
   // Тут не подключается
}
Это выглядело нормально нормально во времена php4 (например, PEAR). Но почему это использует ZF? Разве у такого подхода есть какие-либо плюсы перед autoload? По моему, ZF работал бы шустрее, если бы не страдал повсеместными require_once(), imho.
 

Вурдалак

Продвинутый новичок
Да, это избыточно. Вероятнее всего эти библиотеки писались до появления spl_autoload_register(), либо от незнания существования такой функции.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Открою тебе секрет — во-первых, автолоад можно сделать только в случае, когда ищется класс. Если класс не ищется, или ищется что то другое — автолоад естественно не сработает.
Во-вторых, как правило, сам код автолоада, как правило, как-то нужно добавить к выполнению.
Есть еще в-третьих и в-четвертых, но и этого хватит.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А еще у spl_autoload_register() есть кой-какие проблемы с регистрацией одного и того же класса с разными методами для автолоада.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А помимо интерфейсов еще есть функции, и просто код.
 

Вурдалак

Продвинутый новичок
А ты смотрел примеры в первом посте или написал, чтоб придраться? Речь идёт именно о классах/интерфейсах, которые подключаются в том же ZF везде через require_once. Более того, это мешает спокойно сливать классы/интерфейсы в один большой файл, т.к. если упустишь какой-то класс, то он из-за require_once получится попытка переопределения класса/интерфейса, который уже определён в большом файле.
 

iceman

говнокодер
а помоему Декларация используемых библиотек - круче, все на глазу, не люблю я такую динамику...
 

sverel

Новичок
Открою тебе секрет — во-первых, автолоад можно сделать только в случае, когда ищется класс
Именно про подключение классов идёт речь. Ведь вся логика, все либы, все хелперы, все контроллеры находятся в классах. В большинстве случаев вне класса может находится только загрузчик (bootstrap.php) - но это капля в море. Попробуйте поиском по файлам ZF найти всё require_once.

По поводу второго аргумента. Подключение autoload-а заменяет определение include_path. Сравните:
PHP:
set_include_path(get_include_path() . PATH_SEPARATOR . '/libs/zend/');
//    VS
include_once(/libs/zend/autoload.php);
Согласитесь, вторая строка выглядит нагляднее, понятнее и локаничнее.


А еще у spl_autoload_register() есть кой-какие проблемы с регистрацией одного и того же класса с разными методами для автолоада.
А зачем это вообще? Они не могут быть внутри одного клсса т.к. находятся в разных пакетах: мой + phpExcel + ZF = 3 разных автолоада.

Добавлено: я не хочу полного запрета на ручной include(). Он необходим что бы подключить functions.php или body.tpl. Но если для классов можно использовать более удобный механизм...
 

AmdY

Пью пиво
Команда форума
sverel
пример вашего инклуда очень плохой, потому что начинается с рутового слеша

а с принудительными инклудами есть одна большая проблема - сложность автоматической сборки в один файл. а так добавив логику в автолод можно легко собрать все нужные проекту библиотеки в один файл.
 

sverel

Новичок
Простите.
PHP:
include_once(SITE_DIR . 'libs/zend/autoload.php');

Если Вы соберёте все классы в один файл, то автолоад Вам вообще не понадобится. Хотя удалять его не обязательно - он просто будет апендиксом, который никогда не выполняется.
 

Koc

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

Koc

Новичок
c
а с принудительными инклудами есть одна большая проблема - сложность автоматической сборки в один файл. а так добавив логику в автолод можно легко собрать все нужные проекту библиотеки в один файл.
т.е. не вижу никаких проблем. Думал из моего сообщения это понятно)
 

LONGMAN

Dark Side of the Moon..
У автолоада есть один для меня важный недостаток, это длинные имена классов.
 

AmdY

Пью пиво
Команда форума
LONGMAN
это никак не связано, можно написать автолодер посложнее str_replace('_', '/', $className).

Koc
я писал о том же.
 

Духовность™

Продвинутый новичок
длинные имена классов.
длинные имена классов в коде программы дают лучшее представление о классе объекта, нежелиь короткие имена классов при использовании пространства имен, которое от include не далеко ушло.
 
Сверху