Різниця між "включати" та "вимагати" у php


174

Чи є різниця між ними? Чи є їх використання справою переваги? Чи використовує одне над іншим якісь переваги? Що краще для безпеки?



3
Завжди використовуйте "вимагати". "включити" так само зручно, як електричні двері в сауну.
Марко Мар'яні

2
@MarcoMariani Як би це було незручно? Мабуть, зрозуміло, я просто не бачу цього. Можливо, пара?
Остін Берк

Простіше кажучи, якщо файл 'foo.php' відсутній помилково, я хочу дізнатися якомога швидше, а не тоді, коли викликається функція, яка мала бути в foo.php. Заміна включення на вимогу часто може виявити помилки. Скажімо, config.php відсутній, і програма працює з конфігурацією за замовчуванням. Що краще для безпеки? Що стосується сауни, то коли я всередині, а двері чомусь не відчиняються, мені це не подобається.
Марко Мар'яні

Відповіді:


148

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

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

Див @ відповідь efritz в для прикладу


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

3
"Те, що вам слід використовувати, залежить від ситуації; вимога () найкраще підходить для завантаження файлів, які мають важливе значення для решти сторінки - наприклад, якщо у вас є веб-сайт, керований базою даних, то, використовуючи, потрібно () включити файл, що містить Логін і пароль бази даних, безперечно, переважніше, ніж використання include (). Якщо ви використовували в цій ситуації включати (), ви можете в результаті створити більше попереджень та помилок, ніж ви планували. "
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';здавалося б, ця відповідь виглядає абсолютно невірною. В іншому випадку я повинен отримати фатальну помилку, хоча умова не відповідає дійсності. straceне показує PHP, навіть намагаючись торкнутися file.php.
cHao

На відміну від include (), вимога () завжди читатиметься в цільовому файлі, навіть якщо рядок, на якій він знаходиться, ніколи не виконується. Якщо ви хочете умовно включити файл, використовуйте include (). І Однак, якщо рядок, у якій виникає вимога (), не виконується, жоден з кодів цільового файлу не буде виконаний. Здається, я кажу щось протилежне, чи я нерозумію?
lorless

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

181

requireпризведе до фатальної помилки PHP, якщо файл не вдасться завантажити. (Виконання зупиняється)

includeвидає Попередження, якщо файл не можна завантажити. (Виконання триває)

Ось приємна ілюстрація включення та вимагання різниці :

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

Від: Різниця вимагає від включення php (автор Robert; листопад 2012)


2
посилання розірвано
Michael Peter

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!";
  }

Примітка: наприклад, для роботи 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";
?>

Дуже простий практичний приклад з кодом. Буде показано перше відлуння. Незалежно від того, що ви використовуєте, включіть або вимагайте, оскільки його запуски перед включенням або необхідністю.

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

Якщо ви використовуєте вимагаєте, друге відлуння не виконується, але якщо ви використовуєте, включайте незалежно від того, яка помилка виходить, ви побачите і результат другого відлуння.


-2

У разі включення програми не припиняється та відображається попередження у веб-переглядачі, з іншого боку Потрібна програма припиниться та відобразить фатальну помилку у випадку, якщо файл не знайдений.


Чи справді вам довелося зіткнутися з питанням на 2/1 рік, щоб повторити те, що 2/3 відповідей уже сказали ...?
cHao

4
Aww, він новачок! Напевно, ще не зрозуміла концепція SO.
Ден Хенлі

бідний користувач2069222, тепер він покинув SO: '(
Гагантський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.