Einbinden von Dateien mittels include() und require()
Folien
Falls keine PDF-Präsentation zu sehen ist: Direktdownload der PDF-Präsentation
Wir können die Inhalte von Dateien in ein PHP-Skript einbinden. Dazu verwenden wir include() oder require().
Der Befehl require('irgendeinedatei.txt') wird komplett durch den Inhalt der Datei irgendeinedatei.txt ersetzt (gleich bei include(), s.u.).
Solche include-Dateien werden, wie im Beispiel angedeutet, gerne verwendet, um Konfigurationsinformationen wie Datenbankpasswörter und ähnliches zu speichern. Wenn sich beispielsweise die Passwörter ändern, muss man sie nur in einem einzigen Skript ändern. (pro-linux.de – PHP-Workshop)
Unterschied zwischen include und require
Wenn ein include einen Fehler produziert, arbeitet das Skript weiter (und spuckt nur eine Warnung aus) – bei require bricht es ab (mehr: php.net – Manual zu require).
Das liegt daran, dass bei require der php-Code ersetzt wird. In einer Schleife wird der Code damit möglicherweise nur einmal ersetzt ($bla = $schleifenvariable . "_einbinden.inc"; require($bla);. (Beispiel bei dynamic-webpages.de)
Da wir erst mal nur Klassendateien einbinden (und zwar nur einmal), verwenden wir deshalb vorerst nur require_once. require_once stellt (im Gegensatz zu require) sicher, dass eine bereits eingebundene Datei nicht ein weiteres Mal eingebunden werden kann.
PHP-Anweisungen in include-/require-Dateien
Die inkludierte Datei wird als HTML-Code ausgeführt. Wird also PHP-Code inkludiert, muss dieser in der eingebundenen Datei entsprechend gekennzeichnet werden (durch <?php bzw. ?>).
Syntax:
include ("datei.txt");
require_once("config.inc.php");
Zum Testen des Includes kann am Schluss noch eine Zeile wie
echo "Datei erfolgreich eingebunden!<br />\n";
eingefügt werden.
Übungen
Zusätzliche Dateien (Bilder, Klassendiagramme, HTML-Vorlagen) finden Sie in der Materialsammlung. Diese Übungen können Sie als txt-Datei herunterladen.
Übungen: Dateien mit require/include einbinden
php_21-1) Was zeigt der Browser an?
Gegeben sei eine Datei "test.php" und eine Datei "include.txt":
test.php:
<h1>Überschrift</h1> <?php require_once('include.txt'); echo "<p>Danke.</p>";
?>
include.txt:
<p>Ich bin die include-Datei include.txt.</p>
Was wird im Browser angezeigt?
php_21-2) Was zeigt der Browser an?
Gegeben sei eine Datei "test.php" und eine Datei "include.txt":
test.php:
<h1>Überschrift</h1>
<?php
require_once('include.txt');
echo "<p>Danke.</p>";
?>
include.txt:
Ich bin die include-Datei include.txt.
Was wird im Browser angezeigt?
php_21-3) Was zeigt der Browser an?
Gegeben sei eine Datei "test.php" und eine Datei "include.php":
test.php:
<h1>Überschrift</h1>
<?php
require_once('include.php');
echo "<p>Danke.</p>";
?>
include.php:
<?php for ($a=0;$a<10;$a++) {
echo $a . "<br />";
} ?>
Was wird im Browser angezeigt?
php_21-4) Dateien auslagern
Gegeben sei folgendes Listing:
<?php
if (isset($_GET['absenden']) && isset($_GET['sternzeichen']))
{
$sternzeichen = $_GET['sternzeichen'];
switch ($sternzeichen)
{
case 'Steinbock':
// Anweisungsblock 1 Start
$msg1 = "Sie sind ein Steinbock. Ihnen gefällt es, wenn dieser Satz 6 mal ausgegeben wird.<br />";
for ($a=1;$a<=6;$a++)
{
echo $a . "." . $msg1;
}
// Anweisungsblock 1 Ende
break;
case 'Widder':
// Anweisungsblock 2 Start
echo "Sie sind ein Widder. Als Widder gefallen Ihnen die ungeraden Zahlen. Bitteschön:<br />";
for ($a=1;$a<100;$a=$a+2)
{
echo $a . " ";
}
// Anweisungsblock 2 Ende
break;
case 'Elefant':
// Anweisungsblock 3 Start
echo "Es gibt kein Sternzeichen \"Elefant\"!!!";
// Anweisungsblock 3 Ende
break;
default:
echo "Bitte geben Sie eines der vorgegebenen Sternzeichen ein.";
}
}
?>
<form action = "<?php echo $_SERVER['PHP_SELF'] ?>" method = "get">
Geben Sie hier Ihr Sternzeichen ein (Steinbock, Widder, Elefant):
<input type = "text" name = "sternzeichen" /> <input type = "submit" name = "absenden" />
</form>
Lagern Sie die drei Anweisungsblöcke in der switch-Verzweigung in drei verschiedene Dateien aus.
php_21-5) Klassen auslagern
Gegeben sei folgendes Listing:
<?php
// hier kommen die require_once()-Befehle rein
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Startdatei</title>
</head>
<body>
<h1>Hier findet Klassen-Action statt.</h1>
<?php
class etwasAusgeben
{
// Attribute
private $zufaelligerSpruch;
private $zufallszahl;
private $sprueche = array(
"Ich bin ein lustiger Spruch.",
"Morgen regnet es vielleicht.",
"Guten Tag, ich bin der Regenmacher."
);
// Konstruktor
function __construct()
{
$this->zufallszahl = rand(0, (count($this->sprueche) - 1));
echo "<p>Ich bin der Konstruktor der Klasse etwasAusgeben.<br />
Ich habe eine Zufallszahl gewuerfelt, naemlich " . $this->zufallszahl . "</p>";
}
// Methoden
public function getZufallszahl()
{
return $this->zufallszahl;
}
public function erzeugeZufaelligenSpruch()
{
return $this->sprueche[$this->zufallszahl];
// alternativ: return $this->sprueche[$this->getZufallszahl()];
}
public function spruchAusgeben()
{
echo $this->erzeugeZufaelligenSpruch();
}
}
class ueberschriftErzeugen
{
// Attribute
private $text;
private $zahl;
// Konstruktor
function __construct($eineZahl)
{
if($eineZahl<2)
{
exit("zahl muss 2 oder groesser sein");
}
else
{
$this->zahl = $eineZahl;
}
}
// Methoden
public function zahlenReiheErzeugen()
{
$ausgabe = '';
for($i=1;$i<=$this->zahl;$i++)
{
$ausgabe .= $i;
}
return $ausgabe;
}
public function ueberschriftKomplettErzeugen()
{
$ersterteil = "Zahlenkolonnenüberschrift Nummer ";
$zweiterteil = $this->zahlenReiheErzeugen();
return $ersterteil . $zweiterteil;
}
}
$spruchgenerator = new etwasAusgeben();
$spruchgenerator->spruchAusgeben();
echo "<hr />";
$ueberschrift = new ueberschriftErzeugen(12);
echo "<h1>" . $ueberschrift->ueberschriftKomplettErzeugen() . "</h1>"; ?>
</body>
</html>
a) Versuchen Sie zu verstehen, was das Skript macht.
b) Überprüfen Sie, ob das Skript funktioniert.
c) Lagern Sie die Klassen aus (zahlenreihe.class.php und spruch.class.php) und binden Sie sie mit require_once() ein. Überprüfen Sie, ob das Skript weiterhin läuft.