За последние 24 часа нас посетили 20888 программистов и 1128 роботов. Сейчас ищут 400 программистов ...

Отличие require и require_once

Тема в разделе "PHP для новичков", создана пользователем jurvrn.ru, 11 июл 2019.

Статус темы:
Закрыта.
  1. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    Подскажите какой командой лучше подключать дополнительный файл с функциями
    Код (Text):
    1. require get_template_directory() . '/jurvrn/custom.php';
    или
    Код (Text):
    1. require_once get_template_directory() . '/jurvrn/custom.php';
    В чем их главное отличие? по быстродействию или ...
     
  2. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    require - подходит для подлючения шаблонов: можно подключать множество раз
    require_once - нужен для подлючения фаилов с функциями, классами, настройками. т.е. подключаются только один раз и если подключить уже подключенный файл, он не подключится
     
    jurvrn.ru нравится это.
  3. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @twim32 для моих дополнительных функций оптимально подходит require_once ?
     
  4. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Да, смотри:
    если у тебя есть файл где объявлены какие-нибудь функции, то подключай его через require_once. Так как возможно эти функции понадобяться в разных местах и на разных страницах. Так вот чтобы php не ругался на то ты объявляешь функцию, а она уже есть, используй это.
    Для шаблонов, где нет ни объявлений функций, классов, итд используй require
     
    jurvrn.ru нравится это.
  5. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    например для дополнительного файла стилей css? там функций нет
    понял, спасибо, тема решена
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Нахрена стили подключать в PHP? Имеется в виду, когда отделяется код вывода, выносится в отдельные файлы, получаются так называемые шаблоны
     
    MouseZver нравится это.
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    Для вкуса, наверно :)
     
  8. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer@MouseZver@twim32, у меня wordpress есть основной стиль и стиль для мобильных устройств. Подключаю их через php
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @jurvrn.ru, но не через require, наверное, а через wp_enqueue_style какой-нибудь. Это отдельный разговор :)
     
  10. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer, да стиль подключаю через wp_enqueue_style и там ещё шрифт "сидит"
    PHP:
    1. if ( !function_exists( 'child_theme_configurator_css' ) ):
    2.  
    3.     function child_theme_configurator_css() {
    4.  
    5.         wp_enqueue_style( 'chld_thm_cfg_separate', trailingslashit( get_stylesheet_directory_uri() ) . 'style-mobile.css', array( 'chld_thm_cfg_parent','easywp-maincss','font-awesome' ) );
    6.  
    7.     }
    8.  
    9. endif;
    10.  
    11. add_action( 'wp_enqueue_scripts', 'child_theme_configurator_css', 20 );
    а вопрос у меня был именно по php подключению - какой командой правильно подключать? в зависимости от содержания функций?
    PHP:
    1. require get_template_directory() . '/admin/template-tags.php';
    2. require_once get_template_directory() . '/admin/custom.php';
     
  11. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    А я привык include (_once) пользоваться. Не люблю слово "требуется")
    The difference between include and require arises when the file being included cannot be found: include will emit a warning (E_WARNING) and the script will continue, whereas require will emit a fatal error (E_COMPILE_ERROR) and halt the script. If the file being included is critical to the rest of the script running correctly then you need to use require.
     
  12. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @acso, необходимо использовать то что требуется для логики приложения, а не люблю не люблю.
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    @acso, у этих команд разное назначение. require значительно лучше подходит для «обеспечения целостности». Конечно, когда все разложено по местам, особой разницы нет, но последняя дает гораздо больше спокойствия на случай возникновения всяких «неожиданностей» ;)
     
    acso и jurvrn.ru нравится это.
  14. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Господа, знаю :)
    Ну вот такие у меня бздыки) Да, не люблю. Но это не мешает мне писать логику. Тем более я знаю, где у меня что лежит.
    --- Добавлено ---
    PHP:
    1. $fname = _PAGES_ . "{$par}.php";
    2. if (!file_exists($fname)) $fname = _PAGES_ . "404.php";
    3. include_once($fname);
     
  15. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @jurvrn.ru, правильно подключать любой из 4-х команд, в зависимости от логики приложения (точка)
     
  16. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @acso , @Valick, @miketomlin, запутали... мне для подключения файла дополнительных функций php что лучше подойдет?

    1. require get_template_directory()
    2. require_once get_template_directory()
     
  17. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А я вообще не помню когда последний раз сам использовал require.
     
  18. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    @jurvrn.ru Да всё уже расписали. Есть назначение команд, есть предпочтения. require даст ошибку при отсутствии файла и конец скрипта, include выдаст предупреждение и выполнение скрипта продолжится. _once подразумевает, что этот файл будет включен в код только один раз.
     
    jurvrn.ru нравится это.
  19. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    В теории понятно. По include тоже понял иногда это лучше. С одной стороны мне даже лучше если выполнение кода остановиться, так как в подключаемом файле те функции, которые я "проверяю". Вопрос теперь - once или каждый раз? У меня wordpress
     
  20. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    "Наша песня хороша! Начинай сначала!"

    Для лучшего понимания предлагаю разобраться что всё это значит на английском языке:
    include - вложить (Если фаила по указанному пути нет, просто будет варнинг)
    require - требовать (Если файла нет, страница полностью не отобразиться)
    once - единожды, один раз

    Примеры:
    1. require
    Применяется для вложения php фаилов, без чего страница работать не сможет. Допустим, ты в отдельном фаиле сделал шаблон потрясного меню и хочешь залепить это на сайт, не только сверху, но и снизу. Вопрос: "должна ли страница отобразиться, если там не будет меню?" Если нет, пишем require внизу и вверху нашего шаблона.

    2. require_once
    Допустим, ты написал библиотеку с функциями в одном фаиле. Так же ты написал пару модулей, которые используют эти самые функции. Твои модули ТРЕБУЮТ библиотеку и ты написал require 'my_lib.php' в каждом из них.
    Если у тебя модули будут на разных страницах, то никаких проблем. А вот если ты поместишь оба на одну страницу, то первый модуль объявит функции из твоей библиотеки, а второй будет ругаться на то, что он не может объявить такие функции, ведь они уже были объявлены. Для этого используется require_once. Если библиотека была подключена где-то в коде, то второй раз подключать ее не надо.

    3. include
    Допустим, создал ты новую страницу. И в шапке, и в боковом меню и самом конце страницы, ты хочешь вложить какой-нибудь блок. Пусть это будет смаилик с текстом "Привет, user!". Вопрос: должна ли отображаться страница, если вдруг ты нечаянно удалишь этот файл? Думаю что тут ничего критичного нет, поэтому мы можем инклюдить.

    4. include_once
    Как раз твой пример. Если фаила со стилями нет, это критично? Если это не самый главный фаил где написано все-все-все, то наверное нет. А нужно ли объявлять стили несколько раз? Нет. Достаточно одного. Поэтому используем include_once

    Итоги:
    Просто задай себе 2 вопрса:
    - должна ли страница отображаться если файл не будет найден?
    Если да, то include. Если нет, то require.

    - должен ли код повторяться на странице?
    Если это HTML, простой текст, картинки, и т.д, - тогда просто include или require
    Если это библиотеки функций, классов, стилей, и т.д. - нет смысла их подключать несколько раз на одну страницу. Поэтому используем include_once/require_once.
    ---------------------------------------------
    Изучай английский. Это поможет тебе понимать любой язык программирования (не прям сразу всё, но очень многое). И не переводи с английского на русский, а пытайся мыслить как коренной носитель языка. Не всегда можно найти аналоги слова в другом языке.
     
    jurvrn.ru нравится это.
  21. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    Все понял,
    все понял,
    но на практике - в подключаемом файле функции по объявлению и программированию виджетов. Они будут на каждой странице, но каждый в своей области, которая для всех страниц одинаковая. Это области тоже программируются в дополнительном файле функций php. Каких то переменных там нет. Значит без once ?
     
  22. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Не понял.
    Страница может отображаться без виджета? Да. - include
    Если в виджетах есть функции, которые описаны в фаиле "mylib.php", то в виджетах require_once 'mylib.php'
     
  23. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    Да понял про разницу включить и потребовать) Once или нет? В этом теперь вопрос
    --- Добавлено ---
    В виджетах функций нет, они сами функции.
     
  24. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Я тебе написал подробнейшее описание, еще раз процитировал ключевой момент и можно сказать дал ответ, а ты продолжаешь меня мучить. Не по-христиански это... А ты сам-то что думаешь по этому поводу?
     
    ciklop и jurvrn.ru нравится это.
  25. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    Не понимаю разницы между "описать" функцию и "есть" функция.
    Занимая зону под виджет на странице и объявляя новые виджеты - я что делаю? Ведь в wordpress основные функции записаны в ядро. А создавая конкретный новый виджет я просто использую заложенный в wordpress инструментарий. И вот этот новый виджет я присоединяюсь к основному файлу функций, чтобы его доводить до ума через дополнительный файл и не лазить в основной файл.
    --- Добавлено ---
    PS я не программист, но красоту профессионального кода понимаю. И на форум пришёл для более серьезной вещи - базы событий для каждого пользователя по датам (плпнировщик событий).
    PS. Буду использовать once, сейчас так сделано и ошибок нет. Зона виджетов одинакова для всех страниц (пока).
     
Статус темы:
Закрыта.