Menu

PHP include und require: andere PHP-Dateien einbinden

include 'header.php'; führt an dieser Stelle eine andere PHP-Datei aus, als wäre ihr Code dort eingefügt. require macht dasselbe, stoppt das Skript aber mit einem fatalen Fehler, wenn die Datei fehlt, während include nur warnt und weitermacht. include_once und require_once laden eine Datei nur beim ersten Mal.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

include 'header.php'; führt an dieser Stelle im Skript den Code einer anderen PHP-Datei aus, als wäre er dort eingefügt. require 'header.php'; macht dasselbe, aber wenn sich die Datei nicht laden lässt, stoppt require das Skript mit einem fatalen Fehler, während include nur eine Warnung ausgibt und weitermacht. Der übliche erste Einsatz ist ein Header und ein Footer, die sich alle Seiten teilen.

Der Block schreibt zuerst header.php und footer.php, damit es Dateien zum Einbinden gibt. Führe ihn aus und schau dir den Tab Page an:

Die eingebundenen Dateien sind gewöhnliche PHP-Dateien: Sie können HTML mit <?= ?>-Tags enthalten und sehen die Variable $title, die vor dem require gesetzt wurde. Ändere den Titel und führe den Code erneut aus; jede Seite, die den Header einbindet, würde eine Änderung an dieser einen Datei übernehmen.

include vs require

Der einzige Unterschied ist, was passiert, wenn die Datei fehlt oder nicht lesbar ist. include gibt zwei Warnungen aus, ergibt false, und das Skript läuft weiter:

Warning: include(sidebar.php): Failed to open stream: No such file or directory in /home/index.php on line 2

Warning: include(): Failed opening 'sidebar.php' for inclusion (include_path='.:/usr/share/php83') in /home/index.php on line 2

require gibt dieselbe Warnung aus und wirft dann einen Error, der das Skript beendet, außer etwas fängt ihn ab:

PHP Warning:  require(config.php): Failed to open stream: No such file or directory in /home/index.php on line 2
PHP Fatal error:  Uncaught Error: Failed opening required 'config.php' (include_path='.:/usr/share/php83') in /home/index.php:2

Verwende also require für alles, ohne das die Seite nicht laufen kann (Konfiguration, Funktionsbibliotheken, Klassendateien), und include für optionale Teile. Für einen Teil, der berechtigterweise fehlen kann, prüfst du vorher, statt dich auf die Warnung zu verlassen:

Ausgabe:

Spring sale: 20% off
banner.php included, include returned int(1)
sidebar.php not found, skipped

include_once und require_once

Eine Datei, die eine Funktion oder eine Klasse definiert, lässt sich nur einmal laden: Sie ein zweites Mal zu laden ist ein fataler Fehler, weil die Funktion schon existiert.

Fatal error: Cannot redeclare greet() (previously declared in /home/helpers.php:2) in /home/helpers.php on line 2

Das passiert, sobald zwei Dateien jeweils require 'helpers.php' aufrufen. require_once und include_once merken sich, welche Dateien schon geladen wurden, überspringen sie beim zweiten Mal und liefern true:

Ausgabe:

int(1)
bool(true)
bool(true)
Hello, Ada

Verwende die _once-Formen für Dateien, die etwas deklarieren, und einfaches include für Templates, die du mehr als einmal ausgeben willst. In Projekten mit Composer lädt der Autoloader Klassendateien für dich, also verschwinden require_once-Aufrufe für Klassen größtenteils; siehe Composer.

Einen Wert aus einer eingebundenen Datei zurückgeben

Ein return auf oberster Ebene einer eingebundenen Datei beendet diese Datei und gibt einen Wert an den Ausdruck mit include oder require zurück. Das ergibt eine saubere Konfigurationsdatei: keine globalen Variablen, nur ein Wert, den du einem beliebigen Namen zuweist.

Ausgabe:

My Shop
shop
bool(false)

Die Konfigurationsdateien von Laravel (config/app.php, config/database.php und die übrigen) funktionieren so.

Variablen und Scope in eingebundenen Dateien

Eingebundener Code läuft im Scope der Zeile, die ihn einbindet. Am Anfang eines Skripts sieht er jede globale Variable; in einer Funktion sieht er nur die lokalen Variablen dieser Funktion. Mit der zweiten Regel funktioniert ein winziger Template-Renderer: eine Funktion, deren lokale Variablen genau die Variablen sind, die das Template sehen soll.

Der Tab Page zeigt beide Listen, gerendert aus einer Template-Datei. Weil include in render() läuft, sieht das Template $heading und $products, aber nicht $secret. Die Form foreach ... endforeach im Template ist die alternative Syntax, die PHP für HTML-Templates anbietet.

Include-Pfade und DIR

Ein Pfad wie 'helper.php' wird nicht relativ zu der Datei aufgelöst, die das include enthält. PHP durchsucht die Einstellung include_path (die normalerweise mit . beginnt, dem aktuellen Arbeitsverzeichnis) und erst danach den eigenen Ordner der einbindenden Datei. In partials/nav.php kann include 'helper.php' also eine ganz andere helper.php aus dem Projektstamm laden. __DIR__, das Verzeichnis der aktuellen Datei, nimmt das Raten weg:

Ausgabe:

loaded the root helper.php
loaded partials/helper.php
__DIR__ in nav.php is partials

Schreib jedes Include als __DIR__ . '/relative/path.php'. Das Arbeitsverzeichnis hängt davon ab, wie das Skript gestartet wurde (der Webserver, ein Cronjob, die Kommandozeile aus einem anderen Ordner), aber __DIR__ ändert sich nie.

Nie eine Datei einbinden, die der Nutzer benennt

Ein häufiger erster Router liest den Seitennamen aus der URL: include $_GET['page'] . '.php';. Damit wählt ein Besucher, welche Datei auf dem Server läuft, zum Beispiel ?page=../../config (Local File Inclusion), und mit alten Einstellungen sogar eine Datei von einem anderen Server. Ordne erlaubte Namen stattdessen Dateien zu. Führe den Block aus und klicke auf die Links: Jeder Klick führt das Skript erneut mit einem anderen $_GET['page'] aus.

Nur die drei Namen in $pages können je require erreichen; der Link ../secret bekommt die Seite „Not found“. Wie du Request-Werte sicher liest, steht unter GETund_GET und _POST.

Häufig gestellte Fragen

Was ist der Unterschied zwischen include und require in PHP?

Beide laden eine andere PHP-Datei und führen sie aus. Lässt sich die Datei nicht laden, stoppt require das Skript mit einem fatalen Fehler, während include eine Warnung ausgibt, false liefert und das Skript weiterlaufen lässt. Verwende require für Dateien, ohne die die Seite nicht funktioniert, etwa Konfiguration und Funktionsbibliotheken.

Wann sollte ich require_once statt require verwenden?

Verwende require_once für Dateien, die Funktionen, Klassen oder Konstanten definieren. Eine solche Datei zweimal zu laden ist ein fataler Fehler (Cannot redeclare), und require_once überspringt die Datei, wenn sie schon geladen wurde. Templates, die du mehrmals ausgeben willst, verwenden einfaches include.

Kann eine eingebundene PHP-Datei einen Wert zurückgeben?

Ja. Ein return auf oberster Ebene der eingebundenen Datei beendet sie und wird zum Wert des Ausdrucks mit include oder require: $config = require 'config.php'; mit return ['debug' => true]; in config.php. Ohne return ergibt include den Wert 1.

Hat eine eingebundene Datei Zugriff auf meine Variablen?

Ja. Der eingebundene Code läuft im Scope der Zeile, die ihn einbindet: Am Anfang eines Skripts sieht er die globalen Variablen, und in einer Funktion sieht er die lokalen Variablen dieser Funktion und nichts sonst. Variablen, die er erzeugt, landen im selben Scope.

Sollte ich include('file.php') oder include 'file.php' schreiben?

Beides funktioniert, denn include und require sind Sprachkonstrukte, keine Funktionen; die Klammern umschließen nur den Pfad. Die meisten Styleguides schreiben require 'file.php'; ohne sie.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S