Unterschied zwischen "include" und "require" in PHP


174

Gibt es einen Unterschied zwischen ihnen? Ist ihre Verwendung eine Frage der Präferenz? Ergibt die Verwendung übereinander Vorteile? Was ist besser für die Sicherheit?



3
Verwenden Sie immer "erfordern". "include" ist so praktisch wie eine elektrische Tür in einer Sauna.
Marco Mariani

2
@MarcoMariani Wie wäre das unpraktisch? Es ist wahrscheinlich klar, ich sehe es einfach nicht. Vielleicht der Dampf?
Austin Burk

Um es einfach auszudrücken: Wenn versehentlich eine 'foo.php'-Datei fehlt, möchte ich so schnell wie möglich wissen, nicht wann eine Funktion aufgerufen wird, die in foo.php hätte sein sollen. Das Ersetzen von include durch require kann häufig Fehler aufdecken. Angenommen, config.php fehlt und die Anwendung wird mit einer Standardkonfiguration ausgeführt. Was ist besser für die Sicherheit? Was die Sauna betrifft, wenn ich drinnen bin und die Tür aus irgendeinem Grund nicht geöffnet wird, mag ich es nicht.
Marco Mariani

Antworten:


148

Die Unterschiede finden Sie im ausführlichen PHP-Handbuch auf der Seite vonrequire :

requireist identisch mit, includeaußer dass bei einem E_COMPILE_ERRORFehler auch ein schwerwiegender Pegelfehler auftritt. Mit anderen Worten, das Skript wird angehalten, während include nur eine Warnung ( E_WARNING) ausgibt, mit der das Skript fortgesetzt werden kann.

Siehe @ Antwort des efritz für ein Beispiel


6
tiposaurus.co.uk/2011/04/04/… "Der Hauptunterschied zwischen require () und include () besteht darin, dass wenn Sie () eine Datei benötigen, die nicht geladen werden kann (z. B. wenn sie nicht vorhanden ist) Es wird ein schwerwiegender Fehler generiert, der die Ausführung der Seite vollständig anhält und keine Ausgabe mehr generiert. Wenn Sie dagegen eine Datei einschließen (), die nicht geladen werden kann, wird lediglich eine Warnung und generiert Baue die Seite weiter. "
Stormwild

3
"Welche Sie verwenden sollten, hängt von der jeweiligen Situation ab. Require () eignet sich am besten zum Laden von Dateien, die für den Rest der Seite wichtig sind. Wenn Sie beispielsweise eine datenbankgesteuerte Website haben, verwenden Sie require (), um eine Datei einzuschließen, die die enthält Datenbankanmeldung und Kennwort werden eindeutig der Verwendung von include () vorgezogen. Wenn Sie in dieser Situation include () verwendet haben, werden möglicherweise mehr Warnungen und Fehler generiert, als Sie beabsichtigt hatten. "
Stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';scheint diese Antwort völlig falsch aussehen zu lassen. Andernfalls sollte ein schwerwiegender Fehler angezeigt werden, obwohl die Bedingung nicht erfüllt ist. stracezeigt nicht einmal PHP, das versucht zu berühren file.php.
CHao

Im Gegensatz zu include () liest require () immer die Zieldatei ein, auch wenn die Zeile, in der es sich befindet, nie ausgeführt wird. Wenn Sie eine Datei bedingt einschließen möchten, verwenden Sie include (). UND Wenn jedoch die Zeile, in der require () auftritt, nicht ausgeführt wird, wird auch kein Code in der Zieldatei ausgeführt. Scheint das Gegenteil zu sagen, oder verstehe ich das falsch?
Lorless

1
Alle diese Kommentare beziehen sich auf die Originalversion dieser Antwort, bevor sie bearbeitet wurde. Ursprünglich gab es eine ungültige Behauptung, die behauptete, if (false) require 'file.php';dass 'file.php' geladen (aber nicht ausgeführt) würde. TLDR ignoriert alle diese Kommentare.
Kevin Wheeler


5

Verwenden includeSie diese Option, wenn Sie nichts dagegen haben, dass Ihr Skript fortgesetzt wird, ohne die Datei zu laden (falls sie nicht vorhanden ist usw.) und Sie (obwohl Sie dies nicht sollten) mit einer angezeigten Warnfehlermeldung leben können.

Verwenden requirebedeutet, dass Ihr Skript angehalten wird, wenn es die angegebene Datei nicht laden kann, und einen schwerwiegenden Fehler auslöst.


2

Wie andere betonten, besteht der einzige Unterschied darin, dass erforderlich einen schwerwiegenden Fehler auslöst und Folgendes enthält: eine auffangbare Warnung. Was die Verwendung betrifft, ist mein Rat, sich an die Einbeziehung zu halten. Warum? weil Sie eine Warnung abfangen und den Endbenutzern ein aussagekräftiges Feedback geben können. Erwägen

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

Hinweis: Um beispielsweise 2 zu funktionieren, müssen Sie einen Fehler-zu-Ausnahmen-Handler installieren, wie hier beschrieben. 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");   

Auf der Einschlussstufe ist es kein guter Ort, um zu erfahren, dass die erwartete Datei nicht vorhanden ist. Kein Problem in Ihrem Beispiel ist eines, das Ihre Website-Betrachter abschreckt.
Kzqai

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

Ein sehr einfaches praktisches Beispiel mit Code. Das erste Echo wird angezeigt. Unabhängig davon, ob Sie include oder require verwenden, da die Läufe vor include oder erforderlich sind.

Um das Ergebnis zu überprüfen, geben Sie in der zweiten Zeile eines Codes absichtlich den falschen Pfad zur Datei an oder machen Sie einen Fehler im Dateinamen. Somit hängt das zweite Echo, das angezeigt werden soll oder nicht, vollständig davon ab, ob Sie require oder include verwenden .

Wenn Sie require verwenden, wird das zweite Echo nicht ausgeführt. Wenn Sie jedoch include verwenden , unabhängig davon, welcher Fehler auftritt, wird auch das Ergebnis des zweiten Echos angezeigt.


-2

Im Falle, dass Include Program nicht beendet wird und eine Warnung im Browser angezeigt wird, wird das Require-Programm beendet und zeigt einen schwerwiegenden Fehler an, wenn die Datei nicht gefunden wird.


Mussten Sie wirklich eine 2 1/2 Jahre alte Frage stellen, um zu wiederholen, was 2/3 der Antworten bereits gesagt haben ...?
CHao

4
Oh, er ist ein Neuling! Vermutlich versteht das Konzept von SO noch nicht.
Dan Hanly

armer Benutzer2069222, jetzt verließ er SO: '(
Gagantous
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.