include/include_once und require/require_once

Artikel, Anleitungen, Minikurse und Leitfaden für alle möglichen PC-Themen und PHP/phpBB.
Antworten
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

include/include_once und require/require_once

Beitrag von oxpus »

Um ein anderes Script in das gerade verwendete Script einzubinden, z. B. weil dort immer wiederkehrende Funktionen enthalten sind (in phpBB wäre das beispielsweise die functions.php), stellt PHP die beiden Funktionen include(); und require(); zur Verfügung.
Beide Funktionen binden ein Script genau an der angegebenen Stelle ein und führen dabei die enthaltenen Verarbeitungsschritte aus.
Ab dem Moment stehen also der weiteren Bearbeitung alle errechneten Werte, sämtliche aus einer Datenbank abgefragten Datensätze sowie definierte Klassen und Funktionen zur Verfügung.

Während sich include(); beim Einbinden eines Scripts recht geduldig zeigt, meckert require(); bereits herum, wenn das gewünschte Script nicht gefunden werden kann.

Das ist dann auch schon der eigentliche Unterschied dieser beiden Funktionen:
include(); bindet ein Script ein oder versucht es, hält aber das Hauptscript nicht an, wenn das einzubindende Script fehlen sollte. Man merkt allerdings spätestens dann, wenn man auf die erhofften Daten und/oder Funktionen/Klassen zugreifen will, daß diese schlicht fehlen. Ode rerhält dann eine Fehlermeldung, wenn PHP eine Funktion ausführen soll, die durch ein nicht eingebundenes Script auch folglich nicht definiert wurde.
require(); meldet hingegen sofort, daß das einzubindene Script fehlt, z. B. weil das ACP sonst nicht korrekt funktionieren würde. Die weitere Verarbeitung im Hauptscript wird dann sofort angehalten.

Man kann nun jedes PHP-Script einbinden oder auch einfache Textdateien, die Inhalte gemäß PHP-Syntax enthalten und damit dem Hauptscript Daten oder Funktionen zur Verfügung stellen.
Dabei darf ein Script auch mehrfach eingebunden werden, z. B. durch eine Schleife, um immer an einem bestimmten Punkt der Verarbeitung aktuelle Werte zu erhalten, die das eingebundene Script vielleicht aus einer permanent beschriebenen Datenbank liest.

Doch nun zu den Ausnahmen:
Bindet man ein Script ein, welches z. B. Klassen oder Funktionen definieren soll, so darf man dieses Script nur einmal includieren, bzw. mittels require nur einmal einbinden!
Das geschieht in der Regel (wie auch in einem phpBB) am Beginn eines Scripts, kann aber auch irgendwo mittendrinn oder am Ende geschehen.
Bestimmte Voraussetzungen binden aber ein solches "Definitions"-Script dennoch mehrfach ein, was dann zwangsweise zu PHP-Fehlermeldungen führt.
Hier helfen include_once();, bzw. require_once(); aus:
Beide Varianten includieren ein Script nur, sofern es noch nicht eingebunden und ausgeführt ist!
Wurde z. B. die Datei functions.php bereits includiert, führt ein erneuter Aufruf mittels include(); ode require(); zu einer sofortigen Fehlermeldung, daß die Funktion xyz bereits definiert ist und das Forum wird an dieser Stelle für den Benutzer angehalten.
Includiert man die functions.php allerdings mittels include_once(); oder require_once();, so prüft PHP, ob diese Datei bereits eingebunden und die entsprechende Verarbeitung schon durchgeführt wurden und beendet im positiven Fall die weitere Verarbeitung während des Einbindens. Es wird hier quasi nur ein "Okay" zurückgemeldet, daß die Datei eingebunden ist (ggf. bei require_once(); nicht eingebunden werden konnte, da sie fehlt). Das Hauptscript fährt dann mit der weiteren Verarbeitung fort.

Sollte man nun alle Scripte mittels include_once();, bzw. require_once(); einbinden?
Hier ein klares: NEIN!
Beide Befehle erzeugen Zeiger auf Dateien und deren Inhalte, die, je nach Umfang, Hauptspeicher belegen, der PHP zur Verfügung gestellt wird.
Da der Hauptspeicher schon recht schnell mit definierten Funktionen, Werten und Datensätzen aus der Datenbank gefüllt sein kann, würden permanente Zeiger zur Laufzeit noch schneller das Speicherlimit erreichen lassen und PHP wieder zu einer Fehlermeldung veranlassen, die das Forum anhält.
Daher sollte man immer genau prüfen, wann und wie oft ein Script an eine gewünschten/gedachten Stelle eingebunden wird und ob die betreffende Stelle auch wirklich Sinn macht.
Nur, wenn sich keine geeignetere Stelle für ein sauberes include(); oder require(); finden lässt, ist die Verwendung der Befehle wie oben beschrieben sinnvoll.
Das kann z. B. dann eintreten, wenn nur bei Ausnahmen ein Punkt im Script zweimal ausgeführt wird, aber auch nur an dieser Stelle das includierte Script benötigt wird. Dann würde ein include_once(); Sinn machen und aktiv Speicher schonen sowie die Performance nicht unnötig belasten, sollte das includierte Script umfangreich Verarbeitungsschritte durchführen und grössere Datenmengen bereithalten müssen, die nur an dieser einen bestimmten Stelle im Script gebraucht werden.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Antworten