Ich habe Probleme, den Regelsatz für PHP-relative Include-Pfade zu verstehen. Wenn ich die Datei A.PHP- ausführe und die Datei A.PHP die Datei B.PHP enthält, die die Datei C.PHP enthält, sollte der relative Pfad zu C.PHP in Bezug auf den Speicherort von B.PHP oder den Speicherort von A stehen .PHP? Das heißt, spielt es eine Rolle, aus welcher Datei das Include aufgerufen wird oder nur, was das aktuelle Arbeitsverzeichnis ist und was das aktuelle Arbeitsverzeichnis bestimmt?
php
include
relative-path
Yarin
quelle
quelle
Antworten:
Es ist relativ zum Hauptskript, in diesem Fall A.php. Denken Sie daran, dass
include()
nur Code in das aktuell ausgeführte Skript eingefügt wird.Nein.
Wenn Sie es wichtig machen und ein Include relativ zu B.php ausführen möchten, verwenden Sie die
__FILE__
Konstante (oder__DIR__
seit PHP 5.2 IIRC), die immer auf die aktuelle Literaldatei verweist, in der sich die Codezeile befindet.quelle
__DIR__
genau für diesen Zweck verwenden.include(dirname(__FILE__)."/C.PHP");
, weilinclude("C.PHP");
es ausreicht (Ja! C.PHP kann sich im selben Verzeichnis wie B.PHP befinden). Es kann nur fehlschlagen, wenn Ihr Projekt zwei C.PHP-Dateien enthält.@ Pekka hat mich dorthin gebracht, möchte aber nur mitteilen, was ich gelernt habe:
getcwd()
Gibt das Verzeichnis zurück, in dem sich die Datei befindet, mit deren Ausführung Sie begonnen haben.dirname(__FILE__)
Gibt das Verzeichnis der Datei zurück, die den aktuell ausgeführten Code enthält.Mit diesen beiden Funktionen können Sie jederzeit einen Include-Pfad relativ zu Ihren Anforderungen erstellen.
Wenn sich b.php und c.php ein Verzeichnis teilen, kann b.php c.php wie folgt enthalten:
egal woher b.php gerufen wurde.
Tatsächlich ist dies die bevorzugte Methode zum Einrichten relativer Pfade, da der zusätzliche Code PHP davon befreit, beim Versuch, die Zieldatei zu finden, den include_path durchlaufen zu müssen.
Quellen:
Unterschied zwischen getcwd () und dirname (__ FILE__)? Welches soll ich verwenden?
Warum sollten Sie dirname (__ FILE__) verwenden?
quelle
Wenn der Include-Pfad nicht mit
./
oder beginnt../
, z.Wenn der Include-Pfad mit
./
oder beginnt../
, z.Das
.
oder..
höher ist relativ zugetcwd()
, wobei standardmäßig der Pfad der Eingabedatei.php
verwendet wird (d. H.A.php
) verwendet wird.Getestet auf PHP 5.4.3 (Erstellungsdatum: 8. Mai 2012 00:47:34).
(Beachten Sie auch, dass
chdir()
dies die Ausgabe von ändern kanngetcwd()
.)quelle
chdir(__DIR__)
, das Problem mit zu beheben.getcwd()
, der standardmäßig den Pfad der .php-Eintragsdatei [...] verwendet - nicht unbedingt wahr. Wenn ich PHP in der Befehlszeile ausführe,getcwd()
verweist es auf das aktuelle Arbeitsverzeichnis der Shell, unabhängig davon, welche.php
Datei ich aufrufe. Ich kann mir jedoch vorstellen, dass, wenn PHP in einer Webserverumgebung ausgeführt wird, die Umgebung das aktuelle Arbeitsverzeichnis in der Eintragsdatei initialisiert.php
. Getestet unter MacOS mit PHP 7.2.2 über Homebrew installiert.Die akzeptierte Antwort von Pekka ist unvollständig und im Allgemeinen irreführend. Wenn die Datei als relativer Pfad bereitgestellt
include
wird, sucht das aufgerufene Sprachkonstrukt folgendermaßen danach.Zunächst werden die Pfade der Umgebungsvariablen durchlaufen
include_path
, mit denen festgelegt werden kannini_set
. Wenn dies fehlschlägt, wird im eigenen Verzeichnis des aufrufenden Skripts gesuchtdirname(__FILE__)
(__DIR__
mit php> = 5.3). Wenn dies ebenfalls fehlschlägt, wird nur dann im Arbeitsverzeichnis gesucht! Es stellt sich nur heraus, dass die Umgebungsvariable standardmäßiginclude_path
mit.
dem aktuellen Arbeitsverzeichnis beginnt . Dies ist der einzige Grund, warum zuerst im aktuellen Arbeitsverzeichnis gesucht wird. Siehe http://php.net/manual/en/function.include.php .Die richtige Antwort auf den ersten Teil der Frage lautet also, dass es wichtig ist, wo sich das enthaltene aufrufende Skript befindet. Die Antwort auf den letzten Teil der Frage lautet, dass das anfängliche Arbeitsverzeichnis in einem Webserverkontext das Verzeichnis des aufgerufenen Skripts ist, das alle anderen enthält, während es von PHP verarbeitet wird. In einem Befehlszeilenkontext ist das anfängliche Arbeitsverzeichnis das, was auch immer es ist, wenn PHP an der Eingabeaufforderung aufgerufen wird, nicht unbedingt das Verzeichnis, in dem sich das aufgerufene Skript befindet. Das aktuelle Arbeitsverzeichnis kann jedoch zur Laufzeit mit der PHP-Funktion geändert werden
chdir
. Siehe http://php.net/manual/en/function.chdir.php .Dieser Absatz wurde hinzugefügt, um andere Antworten zu kommentieren. Einige haben erwähnt, dass das Verlassen auf
include_path
weniger robust ist und es daher vorzuziehen ist, vollständige Pfade wie./path
oder zu verwenden__DIR__ . /path
. Einige sagten sogar, dass.
es nicht sicher ist , sich auf das Arbeitsverzeichnis selbst zu verlassen, da es geändert werden kann. Manchmal müssen Sie sich jedoch auf Umgebungswerte verlassen. Beispielsweise möchten Sie möglicherweiseinclude_path
leer setzen, damit das Verzeichnis des aufrufenden Skripts der erste Ort ist, an dem gesucht wird, noch vor dem aktuellen Arbeitsverzeichnis. Der Code wurde möglicherweise bereits regelmäßig aus externen Quellen geschrieben und aktualisiert, und Sie möchten das Präfix nicht__DIR__
jedes Mal neu einfügen, wenn der Code aktualisiert wird.quelle
dirname(__FILE__)
(__DIR__)
mit php> = 5.3 gesucht .)" Sind Sie sicher? Wo ist es dokumentiert? Ich hoffe , Sie sind falsch, und PHP ist nicht zu verwenden__FILE__
und__DIR__
für diesen Zweck, denn das würde sofort brechen einschließlich „Geschwister“ Skripte von Symlink eine! : -o (Was hier auf meinem 7.1-Setup glücklicherweise gut zu funktionieren scheint.)Kurze Antwort: Es ist relativ zum Inclusive-Skript.
TFM erklärt es richtig:
Wenn also /app/main.php sagt,
include("./inc.php")
dass /app/inc.php gefunden wird .Die ./ ist nicht unbedingt erforderlich, entfernt jedoch jegliche Abhängigkeit von include_path.
Ich würde mich nicht darauf verlassen, Include-Dateien im aktuellen Arbeitsverzeichnis zu finden, falls jemand sie ändert
chdir()
.quelle
./
, überprüft sie zuerst das Verzeichnis des aufrufenden Skripts oder zuerst das aktuelle Arbeitsverzeichnis?./
. dh chdir ("/ app / other") wirdinclude("./inc.php")
fehlschlagen. Verwenden Sieinclude("inc.php")
daher in diesem Fall die Sicherheit.Um
a
in aufzunehmenb
, müssen Sieinclude("../a.php");
Um
b
in aufzunehmenc
, müssen Sieinclude("dir2/b.php");
quelle