Heim > Artikel > Backend-Entwicklung > php--require/include/require_once/include_once
require
require und include sind nahezu identisch, bis auf die Art und Weise, wie Fehler behandelt werden. require generiert einen Fehler der Ebene E_COMPILE_ERROR, wenn ein Fehler auftritt. Mit anderen Worten: Es führt dazu, dass das Skript beendet wird, während include nur eine Warnung (E_WARNING) generiert und das Skript weiter ausgeführt wird.
include
include-Anweisung schließt die angegebene Datei ein und führt sie aus.
Die folgenden Dokumente gelten auch für require:
Die enthaltene Datei wird zunächst nach dem durch den Parameter angegebenen Pfad durchsucht. Wenn kein Verzeichnis (nur der Dateiname) angegeben ist, wird sie durchsucht entsprechend dem durch include_path angegebenen Verzeichnis. Wenn die Datei nicht unter include_path gefunden wird, sucht include schließlich in dem Verzeichnis, in dem sich die aufrufende Skriptdatei befindet, und im aktuellen Arbeitsverzeichnis. Die Include-Struktur gibt eine Warnung aus, wenn die Datei am Ende nicht gefunden wird. Dies unterscheidet sich von „require“, was zu einem schwerwiegenden Fehler führt. (Für include_path lesen Sie bitte diesen Artikel: PHP-Erweiterungsoptionen und Konfigurationsinformationen)
Wenn der Pfad definiert ist – ob es sich um einen absoluten Pfad handelt (beginnend mit einem Laufwerksbuchstaben oder unter Windows und / unter Unix/ Linux) ) oder ein relativer Pfad zum aktuellen Verzeichnis (beginnend mit . oder .. ) – include_path wird vollständig ignoriert. Wenn eine Datei beispielsweise mit ../ beginnt, sucht der Parser nach der Datei im übergeordneten Verzeichnis des aktuellen Verzeichnisses.
Wenn eine Datei eingebunden wird, erbt der darin enthaltene Code den Variablenbereich der Include-Zeile. Von diesem Zeitpunkt an sind alle Variablen, die in der aufrufenden Datei in dieser Zeile verfügbar sind, auch in der aufgerufenen Datei verfügbar. Allerdings haben alle in Include-Dateien definierten Funktionen und Klassen einen globalen Gültigkeitsbereich.
Beispiel #1 Einfaches Include-Beispiel
vars.php <?php $color = 'green'; $fruit = 'apple'; ?> test.php <?php echo "A $color $fruit"; // A include 'vars.php'; echo "A $color $fruit"; // A green apple ?>
Wenn include in einer Funktion in der aufrufenden Datei vorkommt, verhält sich der gesamte in der aufgerufenen Datei enthaltene Code so, als ob er mit der Definition übereinstimmt innerhalb der Funktion. Es folgt also dem Variablenbereich dieser Funktion. Die einzige Ausnahme von dieser Regel sind magische Konstanten, die vom Parser verarbeitet werden, bevor die Einbeziehung erfolgt.
Beispiel #2 Einbindung in Funktion
<?php function foo() { global $color; include 'vars.php'; echo "A $color $fruit"; } /* vars.php is in the scope of foo() so * * $fruit is NOT available outside of this * * scope. $color is because we declared it * * as global. */ foo(); // A green apple echo "A $color $fruit"; // A green ?>
Wenn eine Datei eingebunden wird, verlässt der Syntaxparser den PHP-Modus am Anfang der Zieldatei, wechselt in den HTML-Modus und fährt am Ende fort der Datei. Aus diesem Grund muss jeder Code in einer Objektdatei, der als PHP-Code ausgeführt werden muss, in gültigen PHP-Start- und End-Tags enthalten sein.
Wenn „URL-Fopen-Wrapper“ in PHP aktiviert sind (Standardkonfiguration), können sie mit einer URL (über HTTP oder andere unterstützte Wrapping-Protokolle – siehe Unterstützte Protokolle und Wrapping-Protokolle) anstelle einer lokalen Datei angegeben werden Die einzubindende Datei. Wenn der Zielserver die Zieldatei als PHP-Code interpretiert, können Sie mithilfe der URL-Anforderungszeichenfolge für HTTP GET Variablen an die eingebundene Datei übergeben. Dies ist nicht unbedingt dasselbe wie das Enthalten einer Datei und das Erben des Variablenbereichs der übergeordneten Datei. Die Skriptdatei wurde tatsächlich auf dem Remote-Server ausgeführt und das lokale Skript enthält die Ergebnisse.
Warnung: Die Windows-Version von PHP vor Version 4.3.0 unterstützt keinen Remote-Dateizugriff über diese Funktion, auch wenn „allow_url_fopen“ aktiviert ist.
Beispiel Nr. 3: Einbinden über HTTP
<?php /* This example assumes that www.example.com is configured to parse .php * * files and not .txt files. Also, 'Works' here means that the variables * * $foo and $bar are available within the included file. */ // Won't work; file.txt wasn't handled by www.example.com as PHP include 'http://www.example.com/file.txt?foo=1&bar=2'; // Won't work; looks for a file named 'file.php?foo=1&bar=2' on the // local filesystem. include 'file.php?foo=1&bar=2'; // Works. include 'http://www.example.com/file.php?foo=1&bar=2'; $foo = 1; $bar = 2; include 'file.txt'; // Works. include 'file.php'; // Works. ?>
Sicherheitswarnung
Remote-Dateien können vom Remote-Server verarbeitet werden (abhängig vom Dateisuffix und davon, ob auf dem Remote-Server PHP ausgeführt wird), es muss jedoch ein legales PHP-Skript generiert werden, da es vom Remote-Server verarbeitet wird lokaler Server-Deal mit. Soll eine Datei von einem Remote-Server remote ausgeführt werden und nur die Ergebnisse ausgeben, ist es besser, die Funktion readfile() zu verwenden. Achten Sie außerdem besonders darauf, sicherzustellen, dass Remote-Skripte legalen und erforderlichen Code erzeugen.
Verarbeitung von Rückgabewerten: include gibt FALSE zurück und gibt bei einem Fehler eine Warnung aus. Ein erfolgreicher Include gibt 1 zurück, sofern in der Include-Datei nichts anderes angegeben ist. Sie können die Return-Anweisung in einer eingebundenen Datei verwenden, um die Ausführung des Programms in der Datei zu beenden und zu dem Skript zurückzukehren, das es aufgerufen hat. Es ist auch möglich, Werte aus eingebundenen Dateien zurückzugeben. Der Rückgabewert des Include-Aufrufs kann wie bei einer normalen Funktion ermittelt werden. Dies funktioniert jedoch nicht, wenn eine Remote-Datei eingebunden wird, es sei denn, die Ausgabe der Remote-Datei verfügt über zulässige PHP-Start- und End-Tags (wie jede lokale Datei). Sie können die erforderlichen Variablen innerhalb des Tags definieren, die nach dem Speicherort der Datei verfügbar sind.
Da include eine spezielle Sprachstruktur ist, erfordern seine Parameter keine Klammern. Seien Sie vorsichtig, wenn Sie ihre Rückgabewerte vergleichen.
Example #4 比较 include 的返回值
<?php // won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('') if (include('vars.php') == 'OK') { echo 'OK'; } // works if ((include 'vars.php') == 'OK') { echo 'OK'; } ?>
Example #5 include 和 return 语句
return.php
5e761dc189df02af8b3a77896bf6f89f
noreturn.php
ebe9369892d7384cf276f620b752f65d
testreturns.php
3f955376bfdcb5b15a5de19c4f63fc0f
$bar 的值为 1 是因为 include 成功运行了。注意以上例子中的区别。第一个在被包含的文件中用了 return 而另一个没有。如果文件不能被包含,则返回 FALSE 并发出一个E_WARNING 警告。
如果在包含文件中定义有函数,这些函数不管是在 return 之前还是之后定义的,都可以独立在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 4 不会对在 return 之后定义的函数报错。推荐使用 include_once 而不是检查文件是否已包含并在包含文件中有条件返回。
另一个将 PHP 文件“包含”到一个变量中的方法是用输出控制函数结合 include 来捕获其输出,例如:
Example #6 使用输出缓冲来将 PHP 文件包含入一个字符串
<?php $string = get_include_contents('somefile.php'); function get_include_contents($filename) { if (is_file($filename)) { ob_start(); include $filename; $contents = ob_get_contents(); ob_end_clean(); return $contents; } return false; } ?>
要在脚本中自动包含文件,参见 php.ini 中的 auto_prepend_file 和 auto_append_file 配置选项。
Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
require_once
(PHP 4, PHP 5)
require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
include_once
(PHP 4, PHP 5)
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。
include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
Note:
在 PHP 4中,_once 的行为在不区分大小写字母的操作系统(例如 Windows)中有所不同,例如:
Example #1 include_once 在 PHP 4 运行于不区分大小写的操作系统中
<?php include_once "a.php"; // 这将包含 a.php include_once "A.php"; // 这将再次包含 a.php!(仅 PHP 4) ?>
此行为在 PHP 5 中改了,例如在 Windows 中路径先被规格化,因此 C:\PROGRA~1\A.php 和 C:\Program Files\a.php 的实现一样,文件只会被包含一次。