Heim > Artikel > Backend-Entwicklung > Codebeispiele für „Require'- und „Include'-Pfadprobleme in PHP
Dieser Artikel führt hauptsächlich die detaillierte Erklärung von require und include path-Problemen in PHP ein. Freunde, die es benötigen, können sich auf
1 Absoluter Pfad beziehen. Relativer Pfad und nicht spezifizierter Pfad. Bestimmen Sie den Pfad
Relativer Pfad
Relativer Pfad bezieht sich auf den Pfad, der mit . beginnt, zum Beispiel
Der Code lautet wie folgt:
./a/a.php (相对当前目录) ../common.inc.php (相对上级目录),
Absoluter Pfad
Der absolute Pfad ist ein Pfad, der mit / oder einem ähnlichen Laufwerksbuchstaben wie C beginnt: / unter Windows kann der vollständige Pfad ohne Referenzpfad eindeutig sein. Der
-Code lautet beispielsweise wie folgt:
/apache/wwwroot/site/a/a.php c:/wwwroot/site/a/a.php
Unbestimmter Pfad
Alles, was nicht mit oder / beginnt, ist kein Windows-Laufwerksbuchstabe:/ Der Pfad am Anfang, z. B.
, der Code lautet wie folgt:
a/a.php common.inc.php,
Zuerst dachte ich, das sei auch ein relativer Pfad, aber in PHPs Include /require Einschlussmechanismus, diese Art von Pfad beginnt mit . Die Handhabung relativer Pfade ist völlig anders. require './a.php' und require 'a.php' sind unterschiedlich!
Im Folgenden werden die Verarbeitungsmethoden dieser drei Arten von Include-Pfaden analysiert: Denken Sie zunächst an eine Schlussfolgerung: Wenn der Include-Pfad ein relativer Pfad oder ein absoluter Pfad ist, wird er nicht zu include_path (der Umgebungsvariablen include_path) verschoben definiert in php.ini, oder verwenden Sie die Einstellung set_include_path(...), um die Datei im Programm zu finden.
Beschreibung der Testumgebung
Hinweis: Die folgende Diskussion und Schlussfolgerung basieren auf dieser Umgebung: Angenommen, A=http://www.xxx.com/app/test/a.php, hervorheben Auch hier gilt die folgende Diskussion für den Fall des direkten Zugriffs auf A.
2. Relativer Pfad:
Der relative Pfad erfordert ein Referenzverzeichnis, um den endgültigen Pfad der Datei zu bestimmen, unabhängig davon, wie viele Verschachtelungsebenen enthalten sind Referenzverzeichnis ist das Programm. Führen Sie das Verzeichnis aus, in dem sich die Eintragsdatei befindet.
Beispiel 1
A definiert require './b/b.php'; // Dann B=[SITE]/app/test/b/b.php
B Definition require './c.php'; // Dann ist C=[SITE]/app/test/c.php nicht [SITE]/app/test/b/c.php
Beispiel 2
Definiert in A require './b/b.php'; // Dann B=[SITE]/app/test/b/b.php
Definiert in B require '../c.php '; // Dann ist C=[SITE]/app/c.php nicht [SITE]/app/test/c.php
Beispiel 3
A erfordert '.. /b .php'; //Dann B=[SITE]/app/b.php
B erfordert '../c.php' //Dann C=[SITE]/app/c.php Nicht [SITE] /c.php
Beispiel 4:
definiert in A require '../b.php'; // Dann B=[SITE]/app/b.php
Definiert in B require './c/c.php'; //Dann ist C=[SITE]/app/test/c/c.php nicht [SITE]/app/c/c.php
Beispiel 5
Definiert in A require '../inc/b.php' // Dann B=[SITE]/app/inc/b.php
Definiert in B require ' ./c /c.php'; // Dann C immer noch =[SITE]/app/test/c/c.php Nicht [SITE]/app/inc/c/c.php
Beispiel 6
Definiert in A require '../inc/b.php'; // Dann B=[SITE]/app/inc/b.php
Definiert in B require './c.php '; / Dann ist C=[SITE]/app/test/c.php nicht [SITE]/app/inc/c.php
Absoluter Pfad
Absolute Pfade sind relativ einfach und verursachen weniger Verwirrung und Fehler. require|inclue entspricht Dateien auf der Festplatte.
require '/wwwroot/xxx.com/app/test/b.php' // Unter Linux
require 'c:/wwwroot/xxx.com/app/test/b.php'; ; // In Windows wird
dirname(FILE) auch als Verzeichnis in Form eines absoluten Pfads berechnet, aber bitte beachten Sie, dass FILE eine Magic-Konstante ist, die der PHP-Konstante entspricht schreibt diese Anweisung jederzeit in den absoluten Pfad, in dem sich die Datei befindet. Dirname (DATEI) zeigt also immer auf den absoluten Pfad der PHP-Datei, in die diese Anweisung geschrieben wird, und hat nichts damit zu tun, ob die Datei enthalten ist und verwendet wird durch andere Dateien.
Beispiel 1
Required '../b.php' ist in A definiert; // Dann ist B=[SITE]/app/b.php
Require dirname( ist definiert in B FILE).'/c.php'; // Dann B=[SITE]/app/c.php
Beispiel 2
A definiert require '../inc/b . php'; // Dann ist B=[SITE]/app/inc/b.php
B ist in require dirname(FILE) definiert.'/c.php'; /inc /c.php liegt immer im selben Verzeichnis wie B
Fazit: Egal, ob B von A eingebunden und genutzt wird oder direkt darauf zugegriffen wird
B如果 require dirname(FILE).'/c.php'; // 则始终引用到跟B在同一个目录中的 c.php文件;
B如果 require dirname(FILE).'/../c.php'; // 则始终引用到B文件所在目录的父目录中的 c.php文件;
B如果 require dirname(FILE).'/c/c.php'; // 则始终引用到B文件所在目录的c子目录中的 c.php文件;
4. 未确定路径
首先在逐一用include_path中定义的包含目录来拼接[未确定路径],找到存在的文件则包含成功退出,如果没有找到,则用执行require语句的php文件所在目录来拼接[未确定路径]组成的全路径去查找该文件,如果文件存在则包含成功退出,否则表示包含文件不存在,出错。 未确定路径比较容易搞混不建议使用。
5. 解决方案
由于“相对路径”中的“参照目录”是执行入口文件所在目录,“未确定”路径也比较容易混淆,因此最好的解决方法是使用“绝对路径”; 例如b.php的内容如下,无论在哪里require b.php都是以b.php的路径为参照来require c.php的
$dir = dirname(FILE);
require($dir . '../c.php');
或者定义一个通用函数 import.php,将其设置为“自动提前引入文件”,在php.ini做如下配置
更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"
更改配置项(可选)allow_url_include = On
import.php内容如下
代码如下:
function import($path) { $old_dir = getcwd(); // 保存原“参照目录” chdir(dirname(FILE)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录” }
这样就可以使用import()函数来require文件了,无论包含多少级“参照目录”都是当前文件
Das obige ist der detaillierte Inhalt vonCodebeispiele für „Require'- und „Include'-Pfadprobleme in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!