PHP/Modularisierung von Programmcode

Aus Mikiwiki
< PHP
Wechseln zu: Navigation, Suche

Die Unterschiede zwischen "include" und "require"

Der Unterschied zwischen "include" und "require" liegt im Zeitpunkt der Verarbeitung der einzuschliessenden Datei. Das grundlegende Verhalten - Einbinden und Ausführen von Code in anderen Dateien - ist völlig identisch.

"require" wird zuerst ausgeführt - vor dem Parsen des gesamten Skripts. Bei "include" dagegen erfolgt die Einbindung erst zu dem Zeitpunkt, wenn nach dem Parsen die Abarbeitung an dieser Stelle angelangt ist. Wird die Stelle interpretiert, kann sie natürlich auch in einer Schleife stehen. Allerdings muss "include" dann als Block gekennzeichnet sein und in geschweiften Klammern stehen.

Aus dem Verarbeitungszeitpunkt ergeben sich zwei Unterschiede in der Verhaltensweise.

  • "require" ist geringfügig schneller als "include".
  • "include" erzeugt Fehler erst zum Zeitpunkt der Abarbeitung.

Normalerweise können Nutzer den Inhalt der Skripte nicht sehen. Jede Datei mit der Endung ".php" oder ".php5" wird vom HTTP-Server an PHP gesendet; es ist natürlich möglich, auch jede beliebige andere Endung anzugeben. Das geht bei Dateien, die mit Sicherheit keinen PHP-Code enthalten, aber zulasten der Leistung. Oft werden mit "include" einzuschliessende Dateien mit der Endung ".inc" versehen. Auch diese Endung wird nicht verarbeitet. Das ist für den Ablauf des Skripts aber gleichgültig - die Verarbeitung erfolgt im Rahmen des "umgebenden" Skripts und damit unter dessen Regie.

Bekommt nun ein Nutzer den Pfad zu den Include-Dateien heraus, so kann er deren Namen in der Adresszeile des Webbrowsers direkt eingeben. Der HTTP-Server wird die Endung nicht kennen und dem Webbrowser die Datei direkt anbieten - der erkennt einfachen Text und stellt ihn dar. Da in einzuschliessenden Dateien auch Zugangsdaten für Datenbanken stehen können, entsteht so eine erhebliche Sicherheitslücke. Die Abhilfe ist einfach: Alle über "include" einzuschliessenden Dateien werden statt mit der Endung ".inc" mit "inc.php" versehen. So entsteht eine eindeutige Kennzeichnung und im Notfall wird das Parsen des Codes erzwungen. Das mag zwar zu einer Fehlermeldung führen - an den Inhalt gelangt der Nutzer aber so nicht.

Problematik des Mehrfacheinschlusses

Werden in einer Einschlussdatei Funktionen definiert und kommt es an mehreren Stellen zum Einschluss, wird PHP mit einem Fehler reagieren. Die mehrfache Definition von Funktionen ist nicht zulässig. In grösseren Anwendungen kann es aber vorkommen, dass Module mehrfach benötigt werden. In solchen Fällen kann statt "include" die Anwendung "include_once" verwendet werden. Für "require" gibt es die entsprechende Anweisung "require_once". PHP prüft dann, ob der Inhalt bereits gelesen wurde und übergeht in solchen Fällen die Ausführung. Zu Problemen führt das nur, wenn der Inhalt tatsächlich mehrfach ausgeführt werden soll.

Mehr Kontrolle über Einschlussdateien

Mehr Kontrolle über Einschlussdateien erhält man durch die Anwendung der Funktionen "get_required_files" bzw. "get_included_files". Beide geben ein Array mit den Namen der entsprechenden Dateien zurück.