Частенько читая код написанный разными авторами встречаюсь с такой конструкцией Код (PHP): if (!class_exists('Controller')) { require_once dirname(dirname(__FILE__)) . '/Controller.php'; Вопрос зачем вообще нужна эта проверка, ведь если класс включен в скрипт то функция require_once и так его не включит, или я что то не так понимаю
вопрос в файлах или class_exists? в файле может быть куча разных классов. насчет require_once ну да, ее можно заменить на require и кстати можно подключать разные по наполнению классы но с одинаковыми названиями, в смысле не много классов будет а ты выберешь один из..
Вопрос не в class_exists а в том, зачем например проверять включен ли файл и потом его подключать при условии что у меня в самом файле только один класс и нет ничего лишнего
а где идет проверка включен ли он? class_exists оно не файл проверяет. у тебя вообще может быть такой код: Код (PHP): if (!class_exists('Controller')) { class Controller { // .... } }
а еще class_exists инвокает автозагрузчик, если не указано обратного поведения. следовательно, если настроить автозагрузку то и не надо будет руками прописывать require_once с путём к файлу. единственный профит который я вижу в проверке-загрузке это если индийский код настолько криво написан что каждый файл может загружать какой-то разный файл но в котором лежит класс с одинаковым именем.
ну такое может использоваться допустим когда есть CMS и там берется шаблон (тема), который типа подключает свой класс для чего то если он не подключен, примерно такое бывает у WP но только там не классы подключают, а функции определяют. просто автар написал Controller что вводит в заблуждение, + он пишет что часто такое видит, интересно где. Добавлено спустя 2 минуты 50 секунд: PS использование данных конструкций логично только при выполнении очень специфических вещей (описано выше), по этому где то в "повседневном" коде это какая то хрень.
Если один и тот же класс может быть в разных файлах (что само по себе не здорово), то следует использовать autoload. Добавлено спустя 21 секунду: P.S. autoload можно использовать и тогда, когда архитектура нормальная.
Я больше скажу, autoload следует использовать всегда. Но определиться перед этим со структурой проекта. Я не про архитектуру, я про дерево каталогов и логику их формирования. Чтобы можно было в autoload-е прописать нормальный алгоритм именно автоматического подключения, а не чтобы там был свитч, работающий по принципу "жестко прописанному имени отдать жестко прописанный путь". Добавлено спустя 11 минут 24 секунды: Эта проверка для тех, кто: 1) Не знает про autoload; 2) Думает, что эта проверка как-то сэкономит память и время выполнения, потому что реквайр - это довольно тяжелая операция. 3) Не знает, что реквайр_ванс, перед тем, как начать что-то подключать и парсить, заглядывает в массив подключенных файлов, который, кстати, и пользователю доступен через get_included_files(), чтобы узнать, нужно ли вообще трогать файловую систему. И, найдя в этом массиве запись с указанным именем, просто завершает работу.
емнип от include отличается только тем что выдает ошибку если файл недоступен. так что по тяжести тогда все подключения тяжелые.