Sind PHP-include-Pfade relativ zu der Datei oder den aufrufenden code?
Ich habe Probleme beim Verständnis der Regelsatz zu PHP relative Pfade enthalten. Wenn ich die run-Datei A.PHP - und Datei A.PHP schließt Datei B.PHP die enthält Datei C.PHP sollte der relative Pfad zu C.PHP in Bezug auf die Lage der B.PHP oder die Lage des A.PHP? Das heißt, es ist egal, in welche Datei das include aufgerufen wird, oder nur das, was das aktuelle Arbeitsverzeichnis ist - und was bestimmt das aktuelle Arbeitsverzeichnis?
Genauer als akzeptierte Antwort in meine Meinung : stackoverflow.com/a/23902890/1636522.
InformationsquelleAutor Yarin | 2011-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist relativ zu dem Haupt-script, in diesem Fall A.php. Denken Sie daran, dass
include()
nur fügt code in die derzeit ausgeführte Skript.Nicht.
Wenn Sie wollen machen es egal, und Sie enthalten relativ zu B.php verwenden Sie die
__FILE__
ständige (oder__DIR__
seit PHP 5.2 IIRC), die zeigen immer auf die wörtliche aktuellen Datei, die code-Zeile befindet.ist fast Recht. 🙂 Siehe meine Antwort.
Sie können auch
__DIR__
für die genaue Zweck.Diese Antwort ist etwas übertrieben: Sie BRAUCHEN KEINE
include(dirname(__FILE__)."/C.PHP");
, weilinclude("C.PHP");
ist genug (ja! C.PHP kann in demselben Verzeichnis wie B.PHP) Es kann nicht nur, wenn es zwei C.PHP Dateien in Ihrem Projekt.Um es klar zu sagen: Es ist relative beiden B.php und A.php wenn ohne "./" oder ".. / " - Präfix in den include-Pfad. Siehe meine Antwort unten.
InformationsquelleAutor Pekka 웃
@Pekka hab mir da, aber möchte nur zu teilen, was ich gelernt habe:
getcwd()
gibt das Verzeichnis, wo die Datei, die Sie begann ausführen befindet.dirname(__FILE__)
gibt das Verzeichnis, das die Datei enthält, die derzeit ausgeführten code.Mithilfe dieser beiden Funktionen können Sie immer bauen eine include-Pfad in Bezug auf das, was Sie brauchen.
z.B., wenn b.php und c.php ein Verzeichnis freigeben, b.php können gehören c.php wie:
egal wo b.php hieß aus.
In der Tat ist dies die bevorzugte Art der Gründung relative Pfade, wie dem extra-code befreit von PHP aus mit der Iteration über den include_path in der versucht, suchen Sie die Zieldatei.
Quellen:
Unterschied Zwischen getcwd() und dirname(__FILE__) ? Welches sollte ich nutzen?
Warum sollten Sie dirname(DATEI)
InformationsquelleAutor Yarin
Wenn include-Pfad beginnt nicht mit
./
oder../
, z.B.:Wenn include-Pfad beginnt mit
./
oder../
, z.B.:Den
.
oder..
oben ist relativ zugetcwd()
, die standardmäßig auf den Pfad der Eintrag.php
Datei (d.h.A.php
).Getestet auf PHP 5.4.3 (Build-Datum : Mai 8 2012 00:47:34).
(Beachten Sie auch, dass
chdir()
ändern können, die Ausgabe vongetcwd()
.)Vielen Dank für cluing mich mit
chdir(__DIR__)
um das problem zu beheben.[...]
getcwd()
, die standardmäßig auf den Pfad des Eintrags .php von Datei [...] - nicht unbedingt wahr. Wenn ich PHP auf der Kommandozeile danngetcwd()
bezieht sich auf das aktuelle Arbeitsverzeichnis der shell, unabhängig davon, welche.php
Datei, die ich aufrufen. Kann ich mir vorstellen, aber, dass, wenn PHP ausgeführt wird, in eine web-server-Umgebung, die Umgebung initialisiert das aktuelle Arbeitsverzeichnis auf den Eintrag.php
- Datei. Getestet auf macOS mit PHP 7.2.2 installiert via Homebrew.InformationsquelleAutor Johnny Wong
Die akzeptierte Antwort von Pekka ist unvollständig, und in einem allgemeineren Kontext irreführend. Wenn die Datei als relativer Pfad, der Sprache konstruieren
include
wird, sucht es in der folgenden Weise.Ersten, es geht durch die Pfade der environment-variable
include_path
, die gesetzt werden können, mitini_set
. Wenn dies fehlschlägt, wird die Suche in der aufrufenden Skript ein eigenes Verzeichnisdirname(__FILE__)
(__DIR__
mit php >= 5.3.) Wenn dies auch fehlschlägt, dann ist es nur die Suche in das Arbeitsverzeichnis ! Es stellt sich nur heraus, dass standardmäßig die Umgebungsvariableinclude_path
beginnt mit.
, ist das aktuelle Arbeitsverzeichnis. Das ist der einzige Grund, warum es sucht zuerst im aktuellen Arbeitsverzeichnis. Sehen http://php.net/manual/en/function.include.php.So, die richtige Antwort auf den ersten Teil der Frage ist, dass es nicht egal ist, wo befindet sich das mitgelieferte Skript aufrufen. Die Antwort auf den letzten Teil der Frage ist, dass die ersten Arbeitsverzeichnis, in einer web server-Kontext, ist das directory des aufgerufenen Skript, das Skript, das alle einschließt, die andere gleichzeitig bearbeitet von PHP. In einer Befehlszeile Kontext, die ursprüngliche Arbeitsverzeichnis ist das, was es ist, wenn php aufgerufen wird, an der Eingabeaufforderung, die nicht unbedingt das Verzeichnis, in dem das aufgerufene Skript befindet. Die aktuellen Arbeitsverzeichnis, kann jedoch zur Laufzeit geändert werden mit der PHP-Funktion
chdir
. Sehen http://php.net/manual/en/function.chdir.php.Diesem Absatz wird Hinzugefügt, um einen Kommentar auf andere Antworten. Einige haben erwähnt, dass sich auf
include_path
ist weniger robust und somit ist es vorzuziehen, verwenden Sie vollständige Pfade wie./path
oder__DIR__ . /path
. Einige gingen so weit zu sagen, dass das Vertrauen auf das Arbeitsverzeichnis.
sich nicht sicher ist, weil es geändert werden kann. Jedoch einige Male, müssen Sie verlassen sich auf Umwelt-Werte. Zum Beispiel, möchten Sie vielleicht festlegeninclude_path
leer, so dass das Verzeichnis des aufrufenden Skripts ist der erste Ort, den Sie suchen, noch bevor das aktuelle Arbeitsverzeichnis. Der code könnte ja schon geschrieben und regelmäßig aktualisiert von externen Quellen, und Sie nicht möchten, legen Sie das Präfix__DIR__
jedes mal, wenn der code aktualisiert wird.dirname(__FILE__)
(__DIR__)
mit php >= 5.3.)" Sind Sie sicher? Wo ist es dokumentiert? Ich hoffe, Sie sind falsch, und PHP funktioniert nicht verwenden__FILE__
und__DIR__
für das Zweck, denn das würde umgehend zu brechen, darunter auch "Geschwister" - Skripts von symlinked lieben! 😮 (Die, zum Glück, scheint gut zu funktionieren hier, auf meinem 7.1 setup.)InformationsquelleAutor
Kurze Antwort: es ist, relativ zu der darunter Skript.
TFM erklärt es richtig:
So, wenn /app/main.php sagt
include("./inc.php")
finden /app/inc.php.Den ./ ist nicht unbedingt notwendig, trägt aber eine Abhängigkeit von der include_path.
Ich würde nicht verlassen Sie sich auf die Suche nach include-Dateien in das aktuelle Arbeitsverzeichnis, falls jemand änderungen, die es mit
chdir()
../
ist, tut es überprüfen das aufrufende Skript im Verzeichnis erste oder das aktuelle Arbeitsverzeichnis ersten?Howe Nein, Sie sind schon abhängig von dem aktuellen Arbeitsverzeichnis, wenn Sie Ihren include-Pfad starten mit
./
. also chdir("/app/ "andere")include("./inc.php")
scheitern. So verwendeninclude("inc.php")
um sicher zu sein in diesem Fall.wenn die Zeichenfolge starten mit ./ oder ../, es nur aktivieren, wird das aktuelle Arbeitsverzeichnis. (include_path und Verzeichnis des aufrufenden Skripts (B.php) sind beide ignoriert). Siehe meine Antwort für weitere Details.
InformationsquelleAutor Denis Howe
Enthalten
a
imb
müssen Sieinclude("../a.php");
Enthalten
b
imc
müssen Sieinclude("dir2/b.php");
InformationsquelleAutor Olli