Heim > Artikel > Backend-Entwicklung > Seien Sie vorsichtig bei der Verwendung von require_once und den relativen Verzeichnissen in PHP
wwwroot //Der absolute Pfad zum Stammverzeichnis der Website lautet: F:/wwwroot
--folder_a // Ordner A
file_a_a.php file_a_b.php file_a_c.php
--folder_b // Ordner B
file_b_a.php file_b_b.php file_b_c.php
-- index.php
*********************************** *** *******************************
Diese Verzeichnishierarchie ist bereits sehr klar:
wwwroot Als Stammverzeichnis gibt es die Datei index.php und darunter zwei Ordner, Ordner_a und Ordner_b.
Diese beiden Ordner enthalten jeweils 3 PHP-Dateien.
Schauen wir uns zunächst den Inhalt an die index.php-Datei; 🎜>Yiju Tutorial Network >
Php-Tutorial<?php require_once("folder_a/file_a_a.php"); echo "文件folder_a_a.php被包含成功"; ?>>>
FAQ
><?php require_once("../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
Seien Sie vorsichtig bei der Verwendung von PHP require_once und relative Verzeichnisse
<?php class X{ function printInfo(){ echo 'success; } } ?>www.111cn.net Update: 25.06.2012 Herausgeber: xiewen Quelle: Nachdruck
Der Artikel stellt die Verwendung von require_once vor, die Ihnen in der PHP-Entwicklung häufig begegnet beziehen Sie sich darauf. wwwroot //Der absolute Pfad zum Stammverzeichnis der Website ist: F:/wwwroot
--folder_a // Ordner A file_a_a.php file_a_b .php file_a_c.php-- Ordner_b // Ordner B file_b_a.php file_b_b.php file_b_c .php-- index.php****************************** **** ******************************Die Verzeichnishierarchie ist bereits sehr klar: wwwroot ist das Stammverzeichnis und die beiden Ordner „folder_a“ und „folder_b“ unten. Schauen wir uns zunächst die an index.php-Datei. Inhalt: Der Code lautet wie folgt: Code kopieren 537fd85d929fe2ac71c3b13545ab7bea Sehen Sie sich den Inhalt der Datei „folder_a/folder_a_a.php“ an: Der Code lautet wie folgt: Code kopieren 5cb1ab6e07c6ad75bfdb2a886ba3554b
ok Wenn ich floder_a/file_a_a.php jetzt direkt ausführe
dann wird ausgegeben: success
Wenn ich index.php
unter wwwroot ausführe, wird ein Fehler gemeldet, da die
enthaltende Datei:file_b_a.php
kann nicht gefunden werden. Wenn ich jedoch alle Add dirname(FILE).'/' zu require_once() ausführe, können Sie die Ausgabe normal ausführen, unabhängig davon, ob Sie file_a_a.php oder index.php ausführen ************* ******************************* *****************Problem:Das erste Mal habe ich einen relativen Pfad verwendet, daher ist ein Fehler aufgetreten, als ich die Einbindung wiederholt habeBeim zweiten Mal habe ich einen absoluten Pfad verwendet, daher gab es keinen Fehler. Aber ich bin immer noch etwas verwirrt:Ich habe zunächst die folgenden Gründe für Fehler bei der Verwendung relativer Pfade analysiert:Wenn ich index.php ausführe, kann es das Verzeichnis „folder_a“ und „file_a_a“ in diesem Verzeichnis finden, also kopiert es den Inhalt von „folder_a/file_a_a.php“ in die erste Zeile von „index.php“ (die Zeile, die die Anweisung enthält). ) und wird dann weiter ausgeführt (dh der enthaltene Inhalt wird ausgeführt). Zu diesem Zeitpunkt ist es also gleich Es soll require_once('../folder_b/file_b_a.php') in file_a_a.php in index.php ausführen ; Es sucht nach dieser Pfaddatei (file_b_a.php) basierend auf dem aktuellen Speicherort von index.php, und natürlich kann sie nicht gefunden werden. Aber ist das nicht dasselbe? Ich verwende absolute Pfade? Aber warum geht das nicht schief? Vielleicht ist dieser Satz für alle etwas verwirrend, lassen Sie mich das im Detail erklären (je nach Programm). führt zuerst index.php aus (beachten Sie, dass ich zu diesem Zeitpunkt dirname (FILE) hinzugefügt habe, sodass der aktuelle Pfad ein absoluter Pfad ist), index.php wird zuerst ausgeführt Ein Codesatz: require_once(dirname(FILE). '/'.'folder_a/file_a_a.php');Verzeichnisname (DATEI) ist f:/wwwroot/, daher lautet der in diesem Code enthaltene Pfad:
f:/wwwroot/ Ordner_a/Datei_a_a.phpDieser Pfad ist korrekt, es gibt also kein Problem, oder?ok Der erste Schritt ist korrekt abgeschlossenDann wird der Code in Datei_a_a kopiert .php an diesen Speicherort in index.php kopieren: und dann weiter ausgeführt wird: Dies dient dazu, den gesamten Code in file_a_a.php in index.php auszuführen. Schauen wir uns also an, welcher Code ausgeführt wird?<?php require_once(dirname(FILE).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:
<?php require_once(dirname(FILE).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); echo "文件folder_a_a.php被包含成功"; ?>
我们来看个注意事项
假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo
c.php require_once("a.php"); require_once("demo/b.php"); B::demo();a.php class A { }
b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了
require_once("../a.php"); class B extends A { public static function demo() { echo "xx"; } }
执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于
require_once("a.php"); require_once("../a.php"); class B extends A { public static function demo() { echo "xx"; } } B::demo();
原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。
require_once很简单用但在使用时大家尽量使用绝对路径了。
Das obige ist der detaillierte Inhalt vonSeien Sie vorsichtig bei der Verwendung von require_once und den relativen Verzeichnissen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!