1. Auslagern von Programmteilen
Wenn man nun beginnt seine PHP-Skripte zu schreiben werden diese immer länger und länger. Wenn man dann auch z.B. andere PHP-Skripte hat, die in etwa den selben Aufbau haben so hat man einerseits auch wieder ein PHP-Skript das länger und länger wird, andereseits auch ein PHP-Skript dessen Code auch teilweise identisch in anderen PHP-Skripten steckt. Sinnvoller wäre es wenn man all diese identischen Teile auslagern kann und in seinen PHP-Skripten sowas wie Lade den Code XY. Eine Möglichkeit besteht mit Funktionen. Diese müssen aber auch im PHP-Skript selbst stehen und können entsprechend auch doppelt und dreifach in mehreren PHP-Skripten stehen. Besser ist da die Verwendung von include. Diesem Sprachkonstrukt übergibt man ein Dateinamen und das Skript verarbeitet den Inhalt dieser Datei als PHP-Code.
2. Include
Wenn in einem PHP-Skript das include Sprachkonstrukt verwendet wird passieren intern ungefähr folgende Dinge.
-
Beenden des PHP-Modus (
?>
). -
Laden und Verarbeiten der Datei.
-
Wiedereintritt in den PHP-Modus (
<?php
).
Die Verarbeitung geschiet dann genau so als würde der Inhalt der Datei an der
Stelle eingefügt wo das include
steht. Intern wird dabei wie gesagt
vorher der PHP-Modus verlassen und nachher wieder der PHP-Modus betreten.
<p> HTML Code in einer Datei <code>datei.html</code>. </p>
<?php
// Inhalt einer index.php Datei die vom Benutzer geöffnet wird.
echo 'Vor dem Include';
include 'datei.html';
echo 'Nach dem Include';
?>
Die entstehende HTML-Quellcode Ausgabe ist die folgende.
Vor dem Include<p> HTML Code in einer Datei <code>datei.html</code>. </p> Nach dem Include
Hier sieht man auch warum es wichtig ist dass PHP beim include
den PHP-Modus verlässt. So wird sichergestellt das sehr einfach
und ohne Probleme HTML-Dateien geladen werden können. Intern würde der
oben stehende PHP-Code wie folgt aussehen.
<?php
// Inhalt einer index.php Datei die vom Benutzer geöffnet wird.
echo 'Vor dem Include';
?><p>
HTML Code in einer Datei <code>datei.html</code>.
</p>
<?php
echo 'Nach dem Include';
?>
Dies heißt auch wenn man PHP-Dateien auch als PHP-Skripte laden möchte so
müssen diese auch die PHP-Start/Stop-Zeichen <?php
und
?>
enthalten.
<?php
// Datei: foobar.php
echo "Eine zweite Zeile\n";
?>
<?php
// Datei: index.php, wird vom Benutzer geöffnet
echo "Erste Zeile\n";
include 'foobar.php';
echo "Dritte Zeile\n";
?>
Erzeugt die erwartete Ausgabe.
Erste Zeile Eine zweite Zeile Dritte Zeile
PHP hat intern umgefähr folgendes gemacht.
<?php
// Datei: index.php, wird vom Benutzer geöffnet
echo "Erste Zeile\n";
?><?php
// Datei: foobar.php
echo "Eine zweite Zeile\n";
?><?php
echo "Dritte Zeile\n";
?>
Nehmen wir für unsere Vereinfachung die ?><?php
Zeilen
herraus sehen wir den PHP-Code den wir genau haben wollten.
<?php
// Datei: index.php, wird vom Benutzer geöffnet
echo "Erste Zeile\n";
// Datei: foobar.php
echo "Eine zweite Zeile\n";
echo "Dritte Zeile\n";
?>
Aus diesem Grund können auch Variablen verwendet werden, die erst in einer anderen PHP-Datei definiert werden.
<?php
// Datei: config.php
$vorname = 'Max';
$nachname = 'Mustermann';
?>
<?php
// Datei: index.php, die vom Benutzer geöffnet wird
include 'config.php';
echo 'Ich bin '.$vorname.' '.$nachname.', Willkommen auf meiner Homepage';
?>
3. Include mit Verzeichnisstrukturen
Wenn eine Datei geladen wurde die in einem Unterverzeichnis liegt und diese Datei nun z.B. eine weitere Datei laden möchte so sucht PHP an zwei Stellen nach dieser Datei. Die erste Position von der gesucht wird ist die Position von der Datei die die neue Datei laden möchte. Die zweite Position ist die Position von der Datei, die am anfang vom Browser geöffnet wurde. Da dies unverständlich klingt lieber hier ein Beispiel.
<?php
// index.php (wird vom Benutzer aufgerufen)
include 'inc/config.php';
echo 'Mein Name ist "'.$name.'"';
?>
<?php
// config.php (im Verzeichnis inc/)
include 'functions.php';
include 'variables.php';
echo "Konfiguration geladen\n";
?>
<?php
// functions.php (im selben Verzeichnis wie index.php)
function foobar() {
// ...
}
echo "Funktionen geladen\n";
?>
<?php
// variables.php (im Verzeichnis inc/)
$name = 'Max Mustermann';
echo "Variablen geladen\n";
?>
Die Verzeichnisstruktur sieht wie folgt aus.
index.php functions.php inc/config.php inc/variables.php
Wenn nun die index.php
geöffnet wird, so entsteht folgende
Ausgabe.
Funktionen geladen Variablen geladen Konfiguration geladen Mein Name ist "Max Mustermann"
Es scheint also fast kein Unterschied zu machen wo nun die Dateien liegen
die man laden möchte (hier jetzt functions.php
und
inc/variables.php
). Intern schlägt nun der Mechanismus zu
wo er die Datei sucht und dann auch findet.
-
Bei
include 'functions.php';
wird diefunctions.php
zuerst in dem Verzeichnis gesucht wo sich dieconfig.php
Datei befindet. Nicht gefunden also wird nun an der Position gesucht wo die Abarbeitung anfing, in diesem Fall da wo dieindex.php
liegt. Dort wurde die benötigte Datei gefunden und geladen. -
Bei
include 'variables.php';
wird dievariables.php
auch zuerst in dem Verzeichnis gesucht wo sich dieconfig.php
Datei befindet. In diesem Verzeichnis (hierinc/
) liegt dievariables.php
und wird somit auch geladen.
Dieser interne Mechanismus kann aber auch zu Problemen führen, dass es zwei Möglichkeiten
gibt wo eine Datei liegen kann (mit include_path
sogar mehrere). Dieses Verhalten kann deaktiviert werden wenn die zu ladene Datei mit
./
oder ../
anfängt. Dann wird nur noch von der Startdatei gesucht,
nicht mehr von der Include-Datei.
Für den Entwickler heißt dies dass man in einer PHP-Datei, welches includiert wird,
weiterhin include verwenden kann ohne wissen zu müssen von wo das eigene Skript
später aufgerufen wird. Die Entwickler schreiben somit in ihren Skripten einfach include 'variables.php';
anstelle von wilden Ausdrücken wie include dirname(__FILE__).'/variables.php';
.
4. Return von Include
Include-Dateien können wie Funktionen auch ein return enthalten. Somit ist es möglich
ein include
wie eine Funktion zu behandeln und den Rückgabewert in eine
Variable zu speichern.
<?php
// datei.php
return "text";
?>
<?php
// index.php
$var = include 'datei.php';
echo $var; // gibt 'text' aus
?>
Die include
Anweisung liefern Standardmäßig den Integerwert 1
zurück.
Dies ist auch eine häufige Fehlerquelle bei include
von Anfängern. Diese
schreiben in ihren Skripten Ausdrücke wie echo include 'news.php';
. Neben
der Tatsache dass das Newsskript geladen wird erhalten sie auch am eine
in der Ausgabe eine zusätzliche 1
und wundern sich woher diese kommt. Daher
auch der Hinweis dass echo include '....';
in seltenen Fällen Sinn ergibt.