За последние 24 часа нас посетил 62941 программист и 1746 роботов. Сейчас ищет 791 программист ...

Очень интересно

Тема в разделе "PHP для новичков", создана пользователем ParenVkedah, 2 фев 2016.

  1. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Частенько читая код написанный разными авторами встречаюсь с такой конструкцией
    Код (PHP):
    1.  if (!class_exists('Controller')) {
    2.     require_once dirname(dirname(__FILE__)) . '/Controller.php';
    Вопрос зачем вообще нужна эта проверка, ведь если класс включен в скрипт то функция require_once и так его не включит, или я что то не так понимаю
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    вопрос в файлах или class_exists? в файле может быть куча разных классов. насчет require_once ну да, ее можно заменить на require

    и кстати можно подключать разные по наполнению классы но с одинаковыми названиями, в смысле не много классов будет а ты выберешь один из..
     
  3. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Вопрос не в class_exists а в том, зачем например проверять включен ли файл и потом его подключать при условии что у меня в самом файле только один класс и нет ничего лишнего
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это избыточный код, достаточно require_once().
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а где идет проверка включен ли он? class_exists оно не файл проверяет.

    у тебя вообще может быть такой код:
    Код (PHP):
    1. if (!class_exists('Controller')) {
    2.     class Controller {
    3.         // ....
    4.     }
    5. } 
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Получается какая-то индийская архитектура
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а еще class_exists инвокает автозагрузчик, если не указано обратного поведения. следовательно, если настроить автозагрузку то и не надо будет руками прописывать require_once с путём к файлу.
    единственный профит который я вижу в проверке-загрузке это если индийский код настолько криво написан что каждый файл может загружать какой-то разный файл но в котором лежит класс с одинаковым именем.
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну такое может использоваться допустим когда есть CMS и там берется шаблон (тема), который типа подключает свой класс для чего то если он не подключен, примерно такое бывает у WP но только там не классы подключают, а функции определяют.

    просто автар написал Controller что вводит в заблуждение, + он пишет что часто такое видит, интересно где.

    Добавлено спустя 2 минуты 50 секунд:
    PS использование данных конструкций логично только при выполнении очень специфических вещей (описано выше), по этому где то в "повседневном" коде это какая то хрень.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если один и тот же класс может быть в разных файлах (что само по себе не здорово), то следует использовать autoload.

    Добавлено спустя 21 секунду:
    P.S. autoload можно использовать и тогда, когда архитектура нормальная.
     
  10. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Спасибо ребят за разные мнения,
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я больше скажу, autoload следует использовать всегда. Но определиться перед этим со структурой проекта. Я не про архитектуру, я про дерево каталогов и логику их формирования. Чтобы можно было в autoload-е прописать нормальный алгоритм именно автоматического подключения, а не чтобы там был свитч, работающий по принципу "жестко прописанному имени отдать жестко прописанный путь".

    Добавлено спустя 11 минут 24 секунды:
    Эта проверка для тех, кто:
    1) Не знает про autoload;
    2) Думает, что эта проверка как-то сэкономит память и время выполнения, потому что реквайр - это довольно тяжелая операция.
    3) Не знает, что реквайр_ванс, перед тем, как начать что-то подключать и парсить, заглядывает в массив подключенных файлов, который, кстати, и пользователю доступен через get_included_files(), чтобы узнать, нужно ли вообще трогать файловую систему. И, найдя в этом массиве запись с указанным именем, просто завершает работу.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    емнип от include отличается только тем что выдает ошибку если файл недоступен. так что по тяжести тогда все подключения тяжелые.
     
  13. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    реквайр выдаёт фатальную ошибку
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Обращение к несуществующему классу тоже её выдаёт =)
    Шо в лоб, шо по лбу.