Heim  >  Artikel  >  Backend-Entwicklung  >  Seien Sie vorsichtig bei der Verwendung von require_once und den relativen Verzeichnissen in PHP

Seien Sie vorsichtig bei der Verwendung von require_once und den relativen Verzeichnissen in PHP

黄舟
黄舟Original
2017-06-25 11:11:151945Durchsuche

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 &#39;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 habe

Beim 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.php

Dieser Pfad ist korrekt, es gibt also kein Problem, oder?

ok Der erste Schritt ist korrekt abgeschlossen

Dann 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).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>

对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:

<?php
     require_once(dirname(FILE).&#39;/&#39;."../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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn