2011-01-12 15 views
0

Hier ist eine Art dumme Frage. Wenn Datei A ein include() von Datei B enthält und Datei B ein Include der Datei C enthält und alle Pfade relativ sind, sind die 'untergeordneten' Referenzen relativ zu ihrem eigenen Pfad oder zu der 'master'-Datei (Datei A), in der sie enthalten sind?PHP require() - Reaktive Pfade

zum Beispiel:

Verzeichnisstruktur

Wurzel

header.html (Datei B)

/images/logo.png (Datei C)

/site/index.php (Datei A)

index.php enthält: umfassen ('../ header.html');

header.html enthält: include ('images/logo.png');

Funktioniert das? Oder, da index.php die "Master" -Datei ist, wird sie versuchen, im Ordner "Sites" nach "Bildern" zu suchen?

Antwort

1

Sie sind immer relativ zu der "Master" -Datei. Enthaltene Dateien werden als "Injektionen" des Quellcodes in das Hauptskript behandelt, so dass sie sich so verhalten, als wären sie im Hauptskript enthalten.

zu adressieren etwas in Bezug auf die tatsächliche aktuelle Datei, verwenden Sie die __FILE__ und __DIR__ Konstanten, die immer verweisen auf die Datei in sie sind.

+0

+1 für den Hinweis "__DIR__" (ich integrierte diesen Teil schamlos in meine Antwort). – Oswald

+0

ok toll, danke! – dtj

1

Die Pfade sind relativ zum Arbeitsverzeichnis. Das anfängliche Arbeitsverzeichnis ist das Verzeichnis, das die PHP-Datei enthält, die direkt als Antwort auf die HTTP-Anfrage ausgeführt wurde (d. H. Was Sie Master-Datei genannt haben.).

Ein include ändert das Arbeitsverzeichnis nicht, aber es kann manuell geändert werden, indem chdir aufgerufen wird. Ich rate jedoch davon ab, das Arbeitsverzeichnis nur für eine include zu ändern.

Bessere Verwendung set_include_path oder die entsprechende Konfigurationsoption oder, wie von Pekka vorgeschlagen, __DIR__ verwenden, um einen Dateinamen relativ zu dem Verzeichnis der aktuellen Datei zu erstellen.

+0

ah ich sehe. Vielen Dank! – dtj

+0

+1 für die Erinnerung, dass das "Arbeitsverzeichnis" -Prinzip ist immer noch gültig in PHP –