За последние 24 часа нас посетили 24569 программистов и 1721 робот. Сейчас ищут 1874 программиста ...

Поясните с require, include, include_once, require_once

Тема в разделе "PHP для новичков", создана пользователем Bobylev, 21 мар 2012.

  1. Bobylev

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

    С нами с:
    20 фев 2012
    Сообщения:
    9
    Симпатии:
    0
    Мне кажется, я не до конца понимаю принцип работы require, include, include_once, require_once и их принципиальную разницу. Поясните плиз на простых примерах.
     
  2. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Учимся гуглем пользоваться.
     
  3. rainarr

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

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
    include_once, require_once если эти функции кто-то юзает, то это имхо говнокод
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А как в таком случае подключить скрипты, во всех фремворках используются эти ф-ии.
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    аргументы?
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    html-программист, ты откуда это взял? если бы это было правдой, вот этот сценарий вываливался БЫ с ошибкой:
    (файла notexists.php не существует)
    Код (Text):
    1.  
    2. <?php
    3.  
    4. $a = FALSE;
    5.  
    6. echo '(';
    7. if ($a)
    8.     require './notexists.php';
    9. echo ')';
    Может быть в каком-нибудь PHP3 оно работало иначе.

    На самом деле require и include идентичны кроме одного: при отсутствии файла include выдаст Warning, а require завершится критической ошибкой. Если include/require спрятаны за условием, которое НЕ выполнилось, то не произойдет НИЧЕГО, в обоих случаях!

    Суффикс *_once означает, что повторное подключение не произойдет. Наличие *_once в коде означает, что автор не очень хорошо распланировал свой код и ему ссыкотно :)

    Добавлено спустя 9 минут 27 секунд:
    Ну совсем без них не обойдется ни один фреймворк. Другое дело, что автолоадер классов при нормальном проектировании будет это делать за тебя. Т.е. максимум один include в "точке входа" чтобы подключить начальный загрузчик и один include в функции-автолоадере. Всё! Чисто и аккуратно и не надо думать "поставить require или require_once?"
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    есть разные случаи. в некоторых код вложения не должен исполняться повторно. делать проверку в самом вложении? а если мне надо многократно использовать этот код в другом файле? не придумывайте. уже два человека сознались в том что не умеют пользоваться конструкциями подключения файлов.
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Есть разные случаи и разные программисты. В случае ООП:
    1) include в месте использования класса не нужен, т.к. этим занимается автолоадер
    2) в самом автолоадере не надо *_once, т.к. для этого класса он не будет вызван повторно, если класс уже был загружен

    Если вы пишете процедурно и не можете отследить зависимости кода, тогда конечно *_once или собственные проверки типа if (defined(...))
    это я и назвал плохим планированием: зависимости должны быть очевидными и предсказуемыми.
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    artoodetoo, ваши аргументы мне понятны и я с вами согласен на все 100. но, как вы верно заметили, есть разные случаи и программисты. если бы эти конструкции были признаны ненужными и их бы удалили из языка, а весь контроль подключений переложили бы на программиста - это был бы показатель. а то что эти конструкции есть и ими пользуются - не показатель того что программист - ссыкун, пишущий говнокод
     
  10. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ну надо же как на пустом месте тему развили...

    Ну это я и так знаю, собственно поэтому я и вспомнил про фремворк. Но вопрос в другом, rainarr утверждает, что использование include это говнокод. Но ведь другого способа не существует. И да же все фремворки используя автолоадер подключают через include.
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Хз что именно rainarr имел в виду. 90% программистов не умеют внятно высказать свою мысль. Что уж говорить о коде, который они пишут :)