Разница между «включить» и «требовать» в PHP


174

Есть ли разница между ними? Является ли их использование вопросом предпочтения? Дает ли использование одного над другим преимущества? Что лучше для безопасности?



3
Всегда используйте «требовать». «включить» так же удобно, как электрическую дверь в сауне.
Марко Мариани

2
@MarcoMariani Как это будет неудобно? Это, наверное, понятно, я просто этого не вижу. Возможно пар?
Остин Берк,

Проще говоря, если файл 'foo.php' отсутствует по ошибке, я хочу знать как можно скорее, а не когда вызывается функция, которая должна была быть в foo.php. Замена include на require может часто выявлять ошибки. Допустим, отсутствует файл config.php, и приложение работает с конфигурацией по умолчанию. Что лучше для безопасности? Что касается сауны, когда я внутри и дверь почему-то не открывается, мне это не нравится.
Марко Мариани

Ответы:


148

Вы найдете различия, объясненные в подробном руководстве по PHP на страницеrequire :

requireидентичен, за includeисключением того, что при отказе он также приведет к фатальной E_COMPILE_ERRORошибке уровня. Другими словами, он остановит скрипт, тогда как include генерирует только предупреждение ( E_WARNING), которое позволяет скрипту продолжить.

Смотрите ответ @ efritz для примера


6
tiposaurus.co.uk/2011/04/04/… "Ключевое различие между require () и include () состоит в том, что если вам требуется () файл, который не может быть загружен (например, если его там нет), то он генерирует фатальную ошибку, которая полностью останавливает выполнение страницы, и вывод больше не будет генерироваться. С другой стороны, если вы включите () файл, который не может быть загружен, то это просто сгенерирует предупреждение и продолжить создание страницы. "
stormwild

3
«То, что вы должны использовать, зависит от ситуации; require () лучше всего подходит для загрузки файлов, которые важны для остальной части страницы - например, если у вас есть веб-сайт, управляемый базой данных, тогда используйте require (), чтобы включить файл, содержащий логин и пароль для базы данных явно предпочтительнее, чем для использования include (). Если в этой ситуации вы используете include (), то в итоге вы можете генерировать больше предупреждений и ошибок, чем планировали ».
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';Казалось бы, этот ответ выглядит совершенно неправильно. В противном случае я должен получить фатальную ошибку, даже если условие не соответствует действительности. stracePHP не показывает даже попытки прикоснуться file.php.
Чао

В отличие от include (), require () всегда читает в целевом файле, даже если строка, в которой он находится, никогда не выполняется. Если вы хотите условно включить файл, используйте include (). И тем не менее, если строка, в которой происходит require (), не выполняется, ни один из кодов в целевом файле не будет выполнен. Кажется, я говорю противоположное, или я неправильно понимаю?
2013 г. без работы

1
Все эти комментарии относятся к исходной версии этого ответа до его редактирования. Первоначально было недопустимое утверждение, утверждающее, if (false) require 'file.php';что файл 'file.php' будет загружен (но не выполнен). TLDR игнорирует все эти комментарии.
Кевин Уилер

181

requireвыдаст PHP Fatal Error, если файл не может быть загружен. (Исполнение останавливается)

includeвыдает предупреждение, если файл не может быть загружен. (Выполнение продолжается)

Вот хорошая иллюстрация включения и требуют разницы :

введите описание изображения здесь

От: Разница требовать и включать PHP (Роберт; ноябрь 2012)


2
ссылка не работает
Майкл Питер

5

Используйте, includeесли вы не против, чтобы ваш сценарий продолжался без загрузки файла (если он не существует и т. Д.), И вы можете (хотя и не должны) жить с отображаемым предупреждением об ошибке.

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


2

Как отмечали другие, единственное отличие состоит в том, что требуется выбрасывать фатальную ошибку, а включать - ловимое предупреждение. Что касается того, чтобы использовать, мой совет должен придерживаться, чтобы включить. Зачем? потому что вы можете поймать предупреждение и дать значимые отзывы конечным пользователям. Рассматривать

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

NB. Например, для работы 2 необходимо установить обработчик ошибок в исключения, как описано здесь http://www.php.net/manual/en/class.errorexception.php

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   

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

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

Очень простой практический пример с кодом. Первый эхо будет отображаться. Независимо от того, что вы используете, включить или требовать, потому что его запускает прежде, чем включить или требуется.

Чтобы проверить результат, во второй строке кода намеренно укажите неправильный путь к файлу или сделайте ошибку в имени файла. Таким образом, второе эхо, которое будет отображаться или нет, будет полностью зависеть от того, используете ли вы require или include .

Если вы используете require, второе эхо не будет выполнено, но если вы используете include, независимо от того, какая ошибка возникнет, вы также увидите результат второго echo.


-2

Если программа «Включить» не прекратит работу и не отобразит предупреждение в браузере, с другой стороны, программа «Требовать» завершит работу и отобразит фатальную ошибку в случае, если файл не найден.


Вам действительно нужно было натолкнуться на вопрос 2,5 года, чтобы повторить то, что 2/3 ответов уже сказали ...?
Чао

4
Ой, он новичок! Вероятно, еще не понимает концепцию SO.
Дэн Ханли,

бедный пользователь 2069222, теперь он покинул ТАК: '(
Gagantous
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.