Author: Progman, zuletzt bearbeitet von progman @ 2005/03/05 18:25:14
Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.
Include
- Modulares Programmieren
- Include
- Wechseln zwischen HTML und PHP-Modus
- Richtiger Dateiendung für die Dateien
- Include mit Verzeichnissen
- Relative und absolute Pfade
1. Modulares Programmieren
Wenn man an seinem Programm schreibt wird man natürlich feststellen, dass die Datei immer gößer wird. Nach einer gewissen Zeit ist sie so groß, dass das hochladen der Datei eine Ewigkeit dauert weil die Datei schon auf 10KB angewachsen ist. Und manchmal ändert man nur eine kleine Stelle. Und für ein Zeichen, was bearbeitet wurde, müssen 10KB hochgeladen werden. Und wenn mehrere Programmierer an einem Projekt arbeiten würde der eine Programmierer die Arbeiten der anderen Programmierer überschreiben, was natürlich scheisse ist (abgesehen von CVS). Es ist dann nicht möglich, sich die Arbeit aufzuteilen. Deshalb gibt es die include Anweisung.
2. Include
Mit der Include-Anweisung kann in ein Script ein anderere Programmcode reingeladen werden. Man nennt dies auch includen. Als einzigen Parameter dieser Funktion erwartet die Include-Anweisung eine Datei oder aber auch, wenn es die Einstellungen zulässt, eine Datei auf einem anderen Server mittels URL. Das includen von Dateien, die auf anderen Servern liegen, ist aber dringens nicht zu empfehlen. Da include ein Sprachkonstrukt wie echo ist, werden keine Klammern wie bei normalen Funktionsaufrufen benötigt.
Dies ist ein Beispiel wie sowas aussehen könnte.
<?php
// Dateiname: config.php
$name = "Max";
$nachname = "Mustermann";
?>
<?php
// Dateiname: index.php, die man öffnen wird
error_reporting(E_ALL); // alle Fehler anzeigen
include "config.php"; // einbinden der config.php
echo "Ich bin ".$name." und heiße mit Nachnamen ".$nachname;
?>
Läd man beide Dateien hoch und öffnet die index.php wird man folgendes sehen.
Ich bin Max und heiße mit Nachnamen Mustermann
Würde man die config.php Datei nicht hochladen, bzw. versuchen eine Datei zu includen die es nicht gibt, würde dann folgendes stehen:
Warning: Failed opening 'config.php' for inclusion (include_path='.:/usr/local/lib/php') in /..../index.php on line 5 Notice: Undefined variable: name in /..../index.php on line 7 Notice: Undefined variable: nachname in /..../index.php on line 7 Ich bin und heiße mit Nachnamen
3. Wechseln zwischen HTML und PHP-Modus
Wenn PHP eine Datei mittels include einfügt, geschieht dies wie folgt:
-
Wechseln in den HTML-Modus (?>)
-
Einfügen des Quelltextes (Kopieren & Einfügen)
-
Wieder zurück in den PHP-Modus wechseln (<?php)
Dies würde vor dem Includen so aussehen.
<?php
// Dateiname: config.php
$name = "Max";
$nachname = "Mustermann";
?>
<?php
// Dateiname: index.php, die man öffnen wird
error_reporting(E_ALL); // alle Fehler anzeigen
include "config.php"; // einbinden der config.php
echo "Ich bin ".$name." und heiße mit Nachnamen ".$nachname;
?>
Und so würde das Script nach dem include aussehen
<?php
// Dateiname: index.php, die man öffnen wird
error_reporting(E_ALL); // alle Fehler anzeigen
?>
<?php
// Dateiname: config.php
$name = "Max";
$nachname = "Mustermann";
?>
<?php
echo "Ich bin ".$name." und heiße mit Nachnamen ".$nachname;
?>
Deswegen müssen die <?php und ?> am Anfang und am Ende der Datei, da PHP sonst den Inhalt der Datei als HTML-Code erkennt und diesen ungeparsed an den Browser schickt. Der Browser würde dann an dem PHP-Kommentar und an den PHP-Anweisungen scheitern da er ja kein PHP kann.
Da ein Programmcode in ein Script geladen wird sind natürlich auch in diesem Programmcode alle vorher definierten Variablen verfügbar.
<?php
// index.php
error_reporting(E_ALL);
$var = "bla";
include "datei.php";
echo "<br />\n"; // Umbruch erzeugen
echo $foo;
?>
<?php
// datei.php
echo $var;
$foo = "hi";
?>
Dies gibt dann folgendes aus.
bla hi
Hier wird die datei.php durch die index.php include. Letzendlich sieht das dann so aus.
<?php
// index.php
error_reporting(E_ALL);
$var = "bla";
?>
<?php
// datei.php
echo $var;
$foo = "hi";
?>
<?php
echo "<br />\n"; // Umbruch erzeugen
echo $foo;
?>
Wenn wir uns jetzt die ?> <?php wegdenken, würde das Script so aussehen.
<?php
// index.php
error_reporting(E_ALL);
$var = "bla";
// datei.php
echo $var;
$foo = "hi";
echo "<br />\n"; // Umbruch erzeugen
echo $foo;
?>
Hier sieht man dann, dass einmal der String "bla" und der String "hi" ausgegeben wird. Man muss sich nur merken das durch include eine Programmcode in ein Script geladen wird. Wenn man jetzt etwas bearbeiten möchte braucht man nur diese eine Datei bearbeiten. Und diese hochladen geht schneller als eine 10KB-index Datei. Wenn jetzt am Projekt mehrere Programmierer arbeiten kann jeder eine andere Datei programmieren. Der eine schreibt ein Clanwar-Script, der andere ein Online-User-Script. Und später werden dann diese Dateien hochgeladen und durch andere Scripte mit include eingebunden.
4. Richtiger Dateiendung für die Dateien
Beim includen wird ein Programmcode in ein Script geladen. Dabei ist es egal welche Dateiendung die zu includene Datei hat. Hauptsache sie enthält PHP und/oder HTML-Code. Doch sie sollte so aufgebaut sein.
-
Sie sollten auf *.php enden.
-
Sie sollten einen eindeutigen Namen haben, wie config.php für Konfigurationsssachen und so.
Wenn sie nicht mit *.php enden, kann jeder Besucher diese Dateien angucken, wenn er weiß wie sie heißen, http://www.example.com/config.txt öffnen und jeder kann z.B. die MySQL Daten sehen. Damit sowas nicht passiert sollte die Datei auf *.php enden, damit, falls man diese Datei direkt öffnet, diese Datei vorher durch PHP geparsed wird und man dann nix sieht.
5. Include mit Verzeichnissen
Manche Programmierer benutzen Verzeichnisse in ihren Projekten um dort die Include-Dateien abzulegen. Ein Beispiel wäre ein Verzeichnis inc/ und dieses Verzeichnis könnte weitere Verzeichnisse enthalten wie news/ und clanwar/. Dies steht natürlich einem Programmierer frei, solch eine Sturktur anzulegen. Man muss nur beim Include von Dateien aufpassen dass man die richtigen Pfade benutzt.
Wir gehen nun von folgendem Beispiel aus.
-
index.php - Die Datei die man dann öffnen wird
-
inc/config.php - Diese Datei ist die Konfigurationsdatei
-
inc/functions.php - Die Datei enthält eigene definierte Funktionen
-
inc/variablen.php - Enthält für das Projekt wichtige Variablen
-
inc/constant.php - Enthält für das Projekt wichtige Konstanten
Die index.php könnte nun so aussehen.
<?php
// index.php
error_reporting(E_ALL);
include "inc/config.php"; // include der Datei config.php im Verzeichnis "inc/"
echo "Willkommen auf ".SITE_NAME."<br />\n";
echo "Die Webmaster der Seite sind:<br />\n";
echo "<ul>\n";
foreach ($webmasters as $person) {
echo "<li>".$person."</li>\n";
}
echo "</ul>\n";
?>
Die Dateien inc/functions.php, inc/variablen.php und inc/constant.php sehen so aus.
<?php
// functions.php
/* Hier kommen dann eigene Definierte Funktionen rein */
?>
<?php
// constant.php
define("SITE_NAME", "php - power hardcore progamer - a CS-Clan");
?>
<?php
// variablen.php
$webmasters = array(); // ein Leeres Array erzeugen, damit es
// gesetzt ist, falls es keine Webmaster
// gibt
$webmasters[] = "Progman";
$webmasters[] = "Haxx0r";
$webmasters[] = "PlaYer";
?>
Da wir aber die Datei config.php aus dem Verzeichnis inc/ includen wollen müssen wir diese auch erstellen. Doch wie sieht sie aus?
<?php
// config.php
include "constant.php";
include "functions.php";
include "variablen.php";
?>
Und dies wird nicht gehen. Warum das nicht geht zeigt folgende Erklärung.
Beim Aufrufen der Datei index.php wird die Datei config.php aus inc/ includet.
<?php
// index.php
error_reporting(E_ALL);
include "inc/config.php"; // include der Datei config.php im Verzeichnis "inc/"
echo "Willkommen auf ".SITE_NAME."<br />\n";
echo "Die Webmaster der Seite sind:<br />\n";
echo "<ul>\n";
foreach ($webmasters as $person) {
echo "<li>".$person."</li>\n";
}
echo "</ul>\n";
?>
<?php
// config.php
include "constant.php";
include "functions.php";
include "variablen.php";
?>
Dies wird zu diesem hier.
<?php
// index.php
error_reporting(E_ALL);
?>
<?php
// config.php
include "constant.php";
include "functions.php";
include "variablen.php";
?>
<?php
echo "Willkommen auf ".SITE_NAME."<br />\n";
echo "Die Webmaster der Seite sind:<br />\n";
echo "<ul>\n";
foreach ($webmasters as $person) {
echo "<li>".$person."</li>\n";
}
echo "</ul>\n";
?>
Zur besseren Übersicht schreib ich mal die inneren PHP-Tags raus.
<?php
// index.php
error_reporting(E_ALL);
// config.php
include "constant.php";
include "functions.php";
include "variablen.php";
echo "Willkommen auf ".SITE_NAME."<br />\n";
echo "Die Webmaster der Seite sind:<br />\n";
echo "<ul>\n";
foreach ($webmasters as $person) {
echo "<li>".$person."</li>\n";
}
echo "</ul>\n";
?>
Und jetzt haben wir ein Problem. Er versucht nun die Dateien constant.php, functions.php und variablen.php zu includen. Doch aus der Sicht von index.php wird er die nicht finden, da sie ja im Verzeichnis inc/ liegen. PHP wird nun Fehler über Fehler schmeißen. Einmal dass er die Dateien nicht includen kann, dass er die Konstante SITE_NAME nicht finden kann und die Variable $webmasters nicht definiert ist. Also müssen wir die config.php bearbeiten, und zwar so dass die Pfade zu den Dateien stimmt.
<?php
// config.php
include "inc/constant.php";
include "inc/functions.php";
include "inc/variablen.php";
?>
Wenn wir jetzt die index.php aufrufen würde das Script dann wie folgt eingefügt.
<?php
// index.php
error_reporting(E_ALL);
// config.php
include "inc/constant.php";
include "inc/functions.php";
include "inc/variablen.php";
echo "Willkommen auf ".SITE_NAME."<br />\n";
echo "Die Webmaster der Seite sind:<br />\n";
echo "<ul>\n";
foreach ($webmasters as $person) {
echo "<li>".$person."</li>\n";
}
echo "</ul>\n";
?>
(die inneren PHP-Tags habe ich nun rausgeschrieben)
Hier wurde schon die config.php geladen. Jetzt können die anderen Dateien include werden.
<?php
error_reporting(E_ALL);
define("SITE_NAME", "php - power hardcore progamer - a CS-Clan");
$webmasters = array(); // ein Leeres Array erzeugen, damit es
// gesetzt ist, falls es keine Webmaster
// gibt
$webmasters[] = "Progman";
$webmasters[] = "Haxx0r";
$webmasters[] = "PlaYer";
echo "Willkommen auf ".SITE_NAME."<br />\n";
echo "Die Webmaster der Seite sind:<br />\n";
echo "<ul>\n";
foreach ($webmasters as $person) {
echo "<li>".$person."</li>\n";
}
echo "</ul>\n";
?>
(die inneren PHP-Tags und Kommentare habe ich nun rausgeschrieben)
Hier funktioniert nun alles. Die Konstanten sind definiert und die Variablen sind gesetzt und können im Script verwendet werden.
Wenn sich jetzt z.B. der Seitenname sich ändern soll oder es einen neuen Webmaster gibt braucht man einfach nur die entsprechenden Dateien verändern und hochladen. Die index.php und die config.php braucht man nicht hochzuladen.
Wenn man ein Projekt mit Verzeichnissen erstellt, muss man sich bei jeder Datei folgendes Fragen. Wer includet diese Datei und was soll diese Datei selber includen? Verwendet man absolute statt relative Pfade so hat man diese Probleme nicht.
6. Relative und absolute Pfade
Es gibt 2 Arten von Pfade.
-
Relative Pfade - Ein relativer Pfad ist ein Verweis auf ein Verzeichnis oder eine Datei bezogen vom aktuellen Standpunkt. Wenn man z.B. eine Datei in einem Verzeichnis vor erreichen möchte (z.B. um diese zu lesen/bearbeiten/löschen/verschrieben) so muss man das Verzeichnis mit angeben. Wenn man eine Datei erreichen möchte, was ein Verzeichniss zurück ist muss man ../ als Verzeichnis benutzten. Wenn man eine Datei im aktuellen Verzeichnis erreichen möchte gibt man das Verzeichnis ./ an, dies kann aber auch weggelassen werden. PHP erkennt dann, dass das aktuelle Verzeichnis gemeint war.
<?php
error_reporting(E_ALL);
include "datei.php"; // include von datei.php im aktuellen Verzeichnis
include "./datei.php"; // include von datei.php im aktuellen Verzeichnis (.)
include "dir/datei.php"; // include von datei.php im Verzeichnis "dir/"
include "../datei.php"; // include von datei.php ein Verzeichnis zurück
include "../dir/datei.php"; // hier wird zuerst ein Verzeichnis
// zurückgegangen und dann von
// da aus in "dir/" gegangen.
// Von diesem Verzeichnis wird dann
// die datei.php includet.
include ".\\datei.php";
include "..\\datei.php";
/*
Falls man ein Server mit Windows als Betriebssystem hat
so muss man \ als Verzeichnistrennzeichen nehmen. Da
wir \ in Strings escapen müssen, müssen wird \\
schreiben
*/
?> -
Absolute Pfade - Ein Absoluter Pfad ist ein Pfad von ganz am Anfang gesehen und startet unter Linux mit einem /, unter Windows mit dem Laufwerksbuchstaben C:\. Von da aus muss man sich dann durch die Verzeichnisse hangeln bis man an der Gewünschten Datei ist.
<?php
error_reporting(E_ALL);
include "/home/www/htdocs/projekt/league/datei.php";
include "/usr/local/file.php";
// bzw.
include "C:\\Programme\\Apache\\htdocs\\datei.php";
include "D:\\Homepages\\verzeichnis\\file.php";
?>
Fragen zum aktuellen Thema
- Wie wird ein Programmcode in das aktuelle Script geladen?
- Welche Endung sollte eine Datei haben, die includet wird?
- Wie wird ein Programmcode in das aktuelle Script geladen?
-
Mit der Funktion include kann eine Datei, welches ein Programmcode enthält, in das aktuelle Script geladen werden.
- Welche Endung sollte eine Datei haben, die includet wird?
-
Eine Datei die include wird sollte die Endung *.php haben. Dadurch wird sichergestellt dass kein Fremder über http://www.example.com/datei_mit_zugangsdaten.php den Inhalt der Datei bekommt. Er wird dann eine weiße Seite sehen.