require() - Phänomen

MbHelm

Mitglied
Guten Abend,

ich bin gerade auf ein "Phänomen" gestoßen, dass mich doch ziemlich verwirrt.
Ich hab ein Script geschrieben das Funktioniert. Es funktioniert nicht nur bei mir, sondern auch auf anderen Servern.
Dieses Script bindet verschiedene Dateien mittels require() ein. Dabei bereits eingebundene Dateien wiederum Dateien über require() ein.

Hier mal die beispielhafte Verzeichnisstruktur:

PHP:
admin/
    option1/
       option1.php
       option1_header.php
       option1_speichern.php
       option1_start.php
    option2/
       ......
    admin.php
    admin_header.php

Im Prinzip läuft das Script nun so ab:
Der Benutzer ruft die admin.php auf.
Je nachdem welche Option in der admin.php gewählt wird, wird die entsprechende Datei in die admin.php eingebunden.
admin.php:
PHP:
require 'option1/option1.php'

Die option1.php verwaltet jetzt alle Möglichkeiten die zu dieser Option zur Verfügung stehen. Wenn keine Möglichkeit gewählt wird, bindet die option1.php die Datei option1_start.php, sowie die Datei admin_header.php ein.
option1.php:
PHP:
require 'admin_header.php'
require 'option1_start.php';

Und hier wird mein "Phänomen" schon deutlich:
Ich kann aus "option1.php" per require() die Dateien "admin_header.php" und die "option1_start.php" einbinden (die ja auf unterschiedlichen Ebenen der Verzeichnisstruktur liegen), ohne irgendwelche Pfadangaben zu machen. Ich grübel schon 'ne weile darüber, denn was ich bis jetzt gefunden habe, sagt, dass require() immer vom aufrufenden Script ausgeht. Also müsste ich ja entweder die "admin.php" (die die "option1.php" einbindet) als Ur-Script sehen und die Pfadangabe auf die "option1_start.php" so angeben: "require 'option1/option1_start.php'", oder die "option1.php" als Ur-Script annehmen und die Pfadangabe auf die "header_admin.php" so angeben: "require '../admin_header.php'".

Ganz verwirrt hat es mich, dass ich die Datei "option1_header.php" auf zwei Arten in die "option1.php" einbinden kann:
PHP:
require 'option1/option1_header.php'
und 
require 'option1_header.php'

In beiden Fällen funktioniert der Code einwandfrei (auch HTML-Pfade und so).
Trotzdem werde ich das Gefühl nicht los, dass nur eine Version die absolut richtige ist und unter allen Umständen Fehlerfrei läuft.
Vielleicht könnt ihr mir helfen.
 
PHP sucht nach Includes sowohl im aktuellen Verzeichnis als auch in den Include-Verzeichnissen. Wie letztere bei dir definiert sind, musst du mal nachsehen. Vielleicht wird es dann schon klar.
 
Ok, das heißt, um absolut sicher zu gehen, dass mein Script auf allen Servern läuft, sollte ich alle Pfade relativ zum Ur-Verzeichnis (admin.php - da diese Datei die erste ist, die etwas includet) angeben. Da mein "Phänomen" nur unter bestimmten Server-Einstellungen auftritt?
 
Das beobachtete Verhalten ist normal.
icnlude hat gesagt.:
Dateien die mit include eingebunden werden, werden zuerst im include_path relativ zum gegenwärtigen Arbeitsverzeichnis gesucht und danach im include_path relativ zum Verzeichnis des ausgeführten Skripts. Zur Veranschaulichung: Falls Ihr include_path . entspricht, ist das gegenwärtige Arbeitsverzeichnis /www/. Sie haben über include include/a.php eingebunden und in diesem Skript steht die Anweisung include "b.php". In diesem Fall wird b.php zuerst im Verzeichnis /www/ gesucht und danach im Verzeichnis /www/include/.
Es wäre aber besser gleich mit absoluten Pfaden zu arbeiten, da PHP so nicht erst nach der Datei suchen muss und es auch nicht zu Verwechslungen kommen kann, existieren Dateien gleichen Namens in mehreren Verzeichnissen innerhalb der „Include-Verzeichnishierarchie“.
 
Daraus folgere ich, dass das Script so wie es jetzt ist, auch weiterhin überall funktioniert.
Verwechslungen von Dateien sind jedenfalls ausgeschlossen, da alle Dateien einen eindeutigen namen haben. (option1/optioni_speichern.php und option2/option2_speichern.php)

Durch die Verwendung von absoluten Pfaden würde das Script jedoch etwas schneller werden, da PHP nicht erst nach der Datei suchen muss.

Vielen Dank für die Antworten.
 
Zurück