next up previous contents index
Next: PHP & HTML Up: Einführung PHP Previous: Einführung PHP

Unterabschnitte


PHP Grundlagen


Einleitung

PHP[*] ist eine serverseitige, in HTML[*] eingebettete Scriptsprache - oder mit anderen Worten: PHP-Scripte werden auf dem Server ausgeführt, im Gegensatz z.B. zu üblichem JavaScript und Java[*]. Der Programmcode wird in die HTML-Quelldatei geschrieben und somit i.A. nicht in einer extra ,,PHP-Datei`` abgelegt. Als Script werden Programme bezeichnet, die keine eigenständigen Programme sind, weil sie nicht kompliziert genug sind und andere Programme benötigen, um ausgeführt zu werden.

Im Gegensatz zu HTML und JavaScript erscheint der eigentliche PHP-Code i.A. nicht auf der Clientseite, d.h. der Quellcode, den man sich im Browser auch ansehen kann, enthält für gewöhnlich keinen PHP-Code[*]. Der HTML-Code wird beim Abruf der Webseite, wie bei normalen Seiten auch, 1:1 an den Client geschickt; der PHP-Code wird durch den Server ausgeführt und dann die Ausgabe an den Client gesandt. Es ist auch möglich, PHP-Scripte ganz ohne (sichtbare) Ausgabe laufen zu lassen - auch das kann sinnvoll sein.

Immer wenn man sich fragt, ob etwas möglich ist, muß man überlegen, ob dazu eine Aktion auf dem Server (wo die Webseite liegt) oder auf dem Client (wo die Webseite angezeigt wird) notwendig ist. Z.B.: Ist es möglich, mit einem PHP-Befehl die aktuelle Webseite auszudrucken? Die Antwort ist ganz einfach: Damit auf dem Client die Seite ausgedruckt wird, muß dem Browser ein Befehl übermittelt werden. Da PHP aber auf dem Server ausgeführt wird, kann es diesen Befehl folglich nicht selbst in die Tat umsetzen. Auf dem Client wird aber z.B. JavaScript ausgeführt, das einen Befehl anbietet, der die Seite ausdruckt (sofern JavaScript aktiviert ist). Für viele andere Aktionen ist aber nicht einmal JavaScript nötig.

Im vorigen Kapitel wurde SQL beschrieben, jetzt wird PHP erklärt. Dies sind zwei voneinander unabhängige Sprachen, die erst einmal nichts miteinander zu tun haben[*]! Auch wenn es Funktionen in beiden Sprachen gibt, die ähnlich heißen, können sie sich doch deutlich unterscheiden. Im weiteren Verlauf wird gezeigt, wie man die beiden Programmiersprachen zusammenführt. Auch dann muß man sich weiter im Klaren darüber sein, was SQL und was PHP ist.


Grundbefehle

PHP wird einfach in den HTML-Quellcode geschrieben. Damit der Server weiß, in welcher Datei er nach PHP-Scripten suchen soll, müssen die Dateien die richtige Endung (Extension) haben. Bei PHP3 waren ,,.php3`` und ,,.phtml`` üblich, bei PHP4 ist dagegen ,,.php`` gebräuchlicher. Man kann natürlich den Webserver so konfigurieren, daß er jede beliebige Endung als PHP-Script identifiziert. Damit der Server darüber hinaus noch weiß, welche Ausdrücke er in der Datei interpretieren soll, müssen jeweils der Anfang und das Ende des PHP-Teils gekennzeichnet werden. Dafür gibt es drei Möglichkeiten:
1. <? echo "Hello world!"; ?>
2. <?php echo "Hello world!"; ?>
3. <script language="php">
     echo "Hello world!";
   </script>
Die erste Möglichkeit ist die kürzeste und damit bei vielen die beliebteste (wer ist nicht gerne faul?). Sie ist allerdings nicht XML-konform, so daß später Probleme auf den Programmierer zukommen können, wenn man sie benutzt. Außerdem gibt es Server, die diese Variante nicht erkennen. Ich benutze immer die zweite Variante; sie ist kurz aber dennoch XML-Konform.

Die Sprache PHP ist hauptsächlich von C, aber auch von Java und Perl (die ihrerseits von C beeinflußt wurden) beeinflußt. Aber auch für Pascal/Delphi-Programmierer ist die Sprache nicht schwer zu erlernen.
Eine Anweisung wird immer mit einem `;` abgeschlossen.


Der echo-Befehl

Den wichtigsten Befehl haben wird oben schon verwendet: den echo-Befehl, der Strings ausgibt. Im obigen Beispiel wird jeweils ,,Hello world!`` ausgegeben. Der Text, der ausgegeben werden soll, muß natürlich in Anführungsstrichen stehen, da der Server sonst versucht, ihn als PHP-Befehl zu interpretieren. Bei den Anführungsstrichen gibt es zwei verschiedene: einmal das einfache ,,'`` und das doppelte ,,"`` . Es gibt auch einen Unterschied zwischen den beiden: Bei den doppelten Anführungsstrichen versucht der Server, den Text zu interpretieren, bei den einfachen hingegen behandelt er ihn nicht speziell, sondern gibt ihn z.B. direkt aus. Weitere Erklärungen zu Anführungszeichen finden sich in Kapitel 6.2.6.4.
$var = 123;

echo 'Die Variable $var hat den Wert 123!\n';
echo "Die Variable $var hat den Wert 123!\n";
Das erste echo gibt ,,Die Variable $var hat den Wert 123!\n`` aus, das zweite hingegen ,,Die Variable 123 hat den Wert 123!`` mit folgendem Zeilenumbruch.

echo "Say \"Hello World\" my friend";  // Gibt aus: Say "Hello World!" my friend
Wie man sieht, müssen doppelte Anführungsstriche anders geschrieben werden. Dieses Vorgehen nennt man Quoten oder Quoting[*]. Es ist insbesondere für das Ausgeben von HTML-Quelltext in Verbindung mit echo und print nötig und kann u.U. zu Problemen führen, wenn man vergißt, in allen Teilstrings zu quoten. Siehe auch Kapitel 11 (Fehlersuche).

Der print-Befehl

Neben dem echo- gibt es auch den print-Befehl. Im Endeffekt leisten beide dasselbe: Sie geben Text aus. echo ist ein internes Sprachkonstrukt, während hingegen print eine Ausdruck (Expression) ist. echo kann mehrere Argumente haben, die nicht in Klammern stehen dürfen. print kann nur genau ein Argument haben.
Alle folgenden Anweisungen sind zulässig und geben dasselbe aus:

$var1 = "Hallo";
$var2 = "Welt!";

echo $var1," ",$var2;

echo $var1." ".$var2;
print ($var1." ".$var2);

$res = print ($var1." ".$var2);

Zuweisungen

Wenn man der Variablen $a den Wert der Variablen $b zuweisen will, muß man dies mithilfe des Gleichheitszeichens machen. Das bedeutet aber auch, daß man Vergleiche in PHP nicht mit dem einfachen Gleichheitszeichen machen kann; wie man dies erreicht, erfahren wir daher noch später.
$a = $b;


Operatoren

Nur irgendwelche Werte in irgendwelche Variablen zu schreiben, wird irgendwann langweilig. Deshalb gibt es auch ein paar Operatoren. Dabei muß man zwischen den arithmetischen (Zahlen), String- (Text), Bit-, logischen (bool'schen) und Vergleichs-Operatoren unterscheiden.

Arithmetische Operatoren


Tabelle 6.1: Arithmetische Operatoren in PHP
Beispiel Name Ergebnis
$a + $b Addition Summe von $a und $b
$a - $b Subtraktion Differenz von $a und $b
$a * $b Multiplikation Produkt von $a und $b
$a / $b Division Dividend von $a und $b
$a % $b Modulo Rest der Division von $a und $b

Wenn beide Operanden bei der Division vom Typ integer (ganzzahliger Wert) sind, ist das Ergebnis ebenfalls integer. Sobald ein Operand eine Kommazahl ist, ist das Ergebnis auch eine Kommazahl.

Befehle wie `$a = $a + 5` kann man etwas abkürzen:

$a += 5;            // entspricht $a = $a + 5;
$a *= 2;            // entspricht $a = $a * 2;
$i++;               // entspricht $i = $i + 1;
$i--:               // entspricht $i = $i - 1;


String-Operatoren

Es gibt nur einen echten String-Operator: den Verbindungsoperator (`.`).
$a = "Hello ";
$b = $a . "World!"; // jetzt ist $b = "Hello World!"
Auch hier lassen sich Befehle der Form `$a = $a . ``noch etwas Text``` abkürzen:
$a = "Hello ";
$a .= "World!";

Bit-Operatoren

Bitweise Operatoren erlauben es, bestimmte Bits in einer Integervariablen zu setzen.

Tabelle 6.2: Bit-Operatoren in PHP
Beispiel Name Ergebnis
$a & $b UND Bits, die in $a und $b gesetzt sind, werden gesetzt
$a | $b ODER Bits, die in $a oder $b gesetzt sind, werden gesetzt
~$a NICHT Bits, die in $a gesetzt sind, werden nicht gesetzt, und umgekehrt


Logische Operatoren

Logische bzw. bool'sche Operatoren werden zum Beispiel zum Verknüpfen von mehreren Vergleichen bei einer Bedingung benötigt. ,,true`` ist übrigens der Wahrheitswert; dessen Verneinung lautet ,,false``.

Tabelle 6.3: Logische Operatoren in PHP
Beispiel Name Ergebnis
$a and $b UND true, wenn beide $a und $b true sind
$a or $b ODER true, wenn mind. einer $a oder $b true sind
$a xor $b Exklusiv-ODER true, wenn genau einer $a oder $b true sind
!$a NICHT true, wenn $a false ist
$a && $b UND true, wenn beide $a und $b true sind
$a || $b ODER true, wenn mind. einer $a oder $b true sind


Der Unterschied zwischen den beiden UND und ODER liegt in deren Priorität verglichen mit anderen Operatoren.

Vergleichsoperatoren

Für Bedingungen braucht man Vergleichsoperatoren.

Tabelle 6.4: Vergleichsoperatoren in PHP
== Gleich
!= Ungleich
> Größer
< Kleiner
>= Größer gleich
<= Kleiner gleich



Kommentare

Für Kommentare gibt es zwei Möglichkeiten der Schreibweise:
echo "Noch kein Kommentar!";

/* Dies ist ein Kommentar,
der auch über mehrere Zeilen gehen kann */

// Dies ist wieder ein Kommentar, der bis zum Ende der Zeile geht

echo "Kein Kommentar mehr!";
Die erste und die letzte Zeile sind Befehle, der Rest ist Kommentar.

Variablen

Alle Variablen werden durch ein vorangestelltes `$` gekennzeichnet. Die Variablen müssen nicht vorher definiert oder deklariert werden. PHP verwendet den Typ, den es für richtig hält. Der Variablentyp kann auch bei der ersten Benutzung festgelegt werden, indem er in Klammern angegeben wird. In Tabelle 6.5 sind die verfügbaren Typen aufgelistet.


Tabelle 6.5: Typen in PHP
int, integer Integer
real, double, float Double
boolean Boolean
string String
array Array
object Objekt


Integer

Eine Integer-Variable kann (auf 32-Bit-Maschinen) alle ganzen Zahlen im Bereich von -2.147.482.648 bis +2.147.482.647 (entspricht -231-1 bis +231-1 ) als Wert annehmen.

Wird einer Integervariablen ein Wert außerhalb des oben genannten Wertebereichs zugewiesen, wird die Variable in den Typ ,double` umgewandelt.

Man kann Zahlen nicht nur in dem uns geläufigen Dezimalsystem (Basis: 10) eingeben. Es gibt auch noch das hexadezimale System (Basis: 16) und Oktalsystem (Basis: 8). Damit PHP weiß, was wir meinen, wird bei Hexadzimalzahlen ein ,,0x`` und bei Oktalzahlen eine ,,0`` vorangestellt. Diese Zahlensysteme werden häufig wegen ihrer stärkeren Hardware-Nähe benutzt. Für uns sind sie im Moment eher weniger interessant.


Double/Float

Für reelle Zahlen gibt es den Datentyp ,Double` bzw. ,Float`. Der Wertebereich geht (auf 32-Bit-Maschinen) von ca. -1,7E308 bis ca. 1,7E308 (entspricht -21024-1 bis +21024-1 mit einer Genauigkeit von grob 14 Stellen.


Boolean

Mit PHP4 ist auch der Datentyp ,Boolean` eingeführt worden. PHP3 hat den bool'schen Wert ,,true`` als Integer mit dem Wert ,1` interpretiert.


String

In Strings werden Buchstaben-/Zeichenketten gespeichert. Wenn man Strings definiert, muß ihr Inhalt in Anführungszeichen geschrieben werden (siehe auch Kapitel 6.2.1).

Betrachten wir als erstes die doppelten Anführungszeichen (``). Um z.B. innerhalb der Anführungszeichen eines echo- oder print-Befehls eines zu schreiben (so, daß es ausgegeben wird), muß dieses mit einem Backslash (\) versehen werden, weil es sonst den String beenden würde. Buchstaben mit einem vorangestellten Backslash werden als ,,escaped characters[*]`` bezeichnet. Eine Übersicht der escaped characters gibt es in Tabelle 6.6.


Tabelle 6.6: escaped characters
\n line feed: neue Zeile (Abk. LF, ASCII-Code 0x0A)
\r carriage return (Abk. CR, ASCII-Code 0x0D)
\t horizontaler Tabulator (Abk. HT, ASCII-Code 0x09)
\\ Backslash
\$ Dollar-Zeichen
\" doppeltes Anführungszeichen


Auch bei den einfachen Anführungszeichen gibt es escaped characters: Es können genau zwei verwendet werden, nämlich \` (einfaches Anführungszeichen) und \\ (Backslash).

Ein String ist im Prinzip ein Array aus Zeichen. Dadurch kann man problemlos auf einzelne Zeichen zugreifen. Z.B. wird mit $string[n] auf das n-te Zeichen im String zugegriffen. Erfordert eine Funktion als Parameter nun unbedingt ein richtiges Array, muß der String erst konvertiert werden. Die einfachste mir bekannte Möglichkeit ist mit Hilfe einer kleinen for-Schleife (hier in eine Funktion verpackt):

/**
* Die Funktion wandelt einen String in ein Array um und gibt dieses zurück.
*
* @param    string   Der Text, der umgewandelt werden soll
* @return   array    Array mit den einzelnen Buchstaben des Textes
*/
function str2array($text){
  $ar = array();
  for ($i=0; $i<strlen($text); $i++){
    $ar[] = $text[$i];
  }
  return $ar;
}

Die bisher unbekannten Befehle sollen erstmal nicht weiter stören, sie werden weiter unten erklärt. Mehr zu Funktionen im Kapitel 6.7.

Beispiel

Ein kleines Beispiel zu den bis hierher beschriebenen Datentypen:
Die Funktion int floor(float number) schneidet die Nachkommastellen ab und gibt einen Integer zurück.

$a = 1234;          \\ $a ist ein Integer
$b = (double) $a;   \\ $b ist ein Double mit dem Wert 1234
$a = 0123;          \\ Oktalzahl (äquivalent zu 83 dezimal)
$a = 0xbad;         \\ Hexadezimalzahl (äquivalent zu 2989 dezimal)
echo floor((0.1+0.7)*10); \\ Ausgabe ist 7


Array

Ein Array ist eine n-dimensionale Liste. Was soll das heißen? Nehmen wir folgendes Beispiel:
$monat[1] = "Januar";
$monat[2] = "Februar";
$monat[3] = "März";
$monat[4] = "April";
$monat[5] = "Mai";
$monat[6] = "Juni";
$monat[7] = "Juli";
$monat[8] = "August";
$monat[9] = "September";
$monat[10] = "Oktober";
$monat[11] = "November";
$monat[12] = "Dezember";
Oder als Tabelle:



Zeile Name
1 Januar
2 Februar
3 März
4 April
5 Mai
6 Juni
7 Juli
8 August
9 September
10 Oktober
11 November
12 Dezember

Bei dieser Tabelle spricht man von einer 1-dimensionalen Tabelle, weil eine Koordinate (die Zeilennummer) ausreicht, um jedes Feld eindeutig zu bestimmen. Der Index (=Zeilennummer) wird in eckigen Klammer hinter dem Array-Namen angegeben.

Wenn man neben dem Monatsnamen auch die Anzahl der Tage im jeweiligen Monat abspeichern will, braucht man eine 2-dimensionale Tabelle:



Zeile Name Tage
1 Januar 31
2 Februar 28
3 März 31
4 April 30
5 Mai 31
6 Juni 30
7 Juli 31
8 August 31
9 September 30
10 Oktober 31
11 November 30
12 Dezember 31

Und das ganze in PHP:

$monat[1]["Name"] = "Januar";           $monat[1]["Tage"] = 31;
$monat[2]["Name"] = "Februar";          $monat[2]["Tage"] = 28;
$monat[3]["Name"] = "März";             $monat[3]["Tage"] = 31;
$monat[4]["Name"] = "April";            $monat[4]["Tage"] = 30;
$monat[5]["Name"] = "Mai";              $monat[5]["Tage"] = 31;
$monat[6]["Name"] = "Juni";             $monat[6]["Tage"] = 30;
$monat[7]["Name"] = "Juli";             $monat[7]["Tage"] = 31;
$monat[8]["Name"] = "August";           $monat[8]["Tage"] = 31;
$monat[9]["Name"] = "September";        $monat[9]["Tage"] = 30;
$monat[10]["Name"] = "Oktober";         $monat[10]["Tage"] = 31;
$monat[11]["Name"] = "November";        $monat[11]["Tage"] = 30;
$monat[12]["Name"] = "Dezember";        $monat[12]["Tage"] = 31;

In diesem Beispiel sehen wir zwei wichtige Eigenschaften von Arrays in PHP: Zum einen werden bei mehreren Dimensionen die Indizes einzeln in eckigen Klammern hinter dem Array-Namen angegeben. Zum anderen kann man bei PHP, im Gegensatz zu gewöhnlichen Programmiersprachen, für die Indizes beliebige Datentypen verwenden. Dadurch werden sogenannte assoziative Arrays möglich.

Wie kann man sich n-dimensionale Arrays vorstellen? Bei 3 Dimensionen ist es noch relativ einfach: Nimmt man mehrere 2-dimensionale Arrays und legt diese aufeinander, hat man die 3. Dimension. Ab der 4. Dimension wird das schon etwas schwerer. Aber im Zweifelsfall muß man sich die Arrays nicht vorstellen, sondern nur Daten in ihnen speichern.


IF

Die IF-Abfrage ist eines der wichtigsten Elemente der Programmierung, die Syntax ist identisch zu C:
if (expr)
  statement
`expr` ist Platzhalter für die Bedingung und `statement` für den Befehl, der bei erfüllter Bedingung ausgeführt werden soll. Als Beispiel:
if ($a>$b)
  print "a ist größer als b";
Falls man mehr als einen Befehl hat, der ausgeführt werden soll, so ist auch das möglich. Man muß die Befehle nur in geschweifte Klammern einschließen:
if ($a>$b) {
  print "a ist größer als b";
  $b = $a;
}

Man kann natürlich auch nur einzelne Befehle in geschweifte Klammern einschließen (und sei es nur, um einheitlich zu programmieren).


ELSE

Wenn man zwei Anweisungen hat, die abhängig von einer Bedingung alternativ ausgeführt werden sollen, so kann man entweder zwei IF-Abfragen mit gegensätzlichen Bedingungen nehmen...
if ($a>$b)
  print "a ist größer als b";
if ($a<=$b)
  print "a ist nicht größer als b";
...oder aber den ELSE-Zweig verwenden:
if ($a>$b)
  print "a ist größer als b";
 else
  print "a ist nicht größer als b";

Analog zu IF kann man auch hier mehrere Befehle pro Zweig (IF, ELSE) angegeben; in diesem Fall müssen diese Anweisungen in geschweiften Klammern geschrieben werden. Kombinationen (z.B. geschweifte Klammern bei IF, aber keine bei ELSE) sind möglich.


ELSEIF

ELSEIF ist eine Kombination aus ELSE und IF. Am Beispiel wird dies hoffentlich deutlich:
if ($a > $b) {
    print "a ist größer als b";
} elseif ($a == $b) {
    print "a ist gleich b";
} else {
    print "a ist kleiner als b";
}


Alternative Syntax für IF: IF(): ...ENDIF;

Falls man in dem Fall, daß eine bestimmte Bedingung erfüllt ist, ganze HTML-Blöcke ausgeben will, bietet sich eine alternative Syntax an:
<?php if ($a<$b): ?>
<h1>A ist kleiner als B</h1>
<?php endif; ?>
Der HTML-Text wird nur dann ausgegeben, wenn die Bedingung ,,A kleiner B`` erfüllt ist. Es können auch mehrere HTML-Zeilen benutzt werden. Hier machen geschweifte Klammern natürlich keinen Sinn, wie auch im folgenden Fall.


Alternative Syntax für IF: (?:)

Wenn man je nach Bedingung bestimmte Werte haben will, kann man auch die Kurzsyntax verwenden. Allgemein:
(Bedingung?Rückgabewert wenn true:Rückgabewert wenn false)
An einem konkreten Beispiel:
<?php
  echo ($a < $b?"A ist kleiner B":"");
?>
Ich jedoch mag ich diese Syntax nicht besonders, weil sie mir zu unübersichtlich ist. Mein Lektor ist da anderer Ansicht. ;-)


WHILE

WHILE-Schleifen sind die einfachsten Schleifen in PHP. Die Grundform der WHILE-Schleife ist die folgende:
WHILE (expr) statement
Die Bedeutung der WHILE-Schleife ist einfach: Solange die Bedingung `expr` erfüllt ist, wird die Anweisung `statement` ausgeführt. Falls die Bedingung von Anfang an nicht erfüllt ist, wird die Anweisung überhaupt nicht ausgeführt. Analog zu IF müssen mehrere Anweisungen, die zur selben WHILE-Schleife gehören, in geschweifte Klammern eingeschlossen werden.

Man kann auch die alternative Syntax nehmen:

WHILE (expr) : statement ... ENDWHILE;
Das Ergebnis der folgenden Beispiele ist identisch; beide geben die Zahlen von 1 bis 10 aus.
/* Beispiel 1 */
$i=1;
while ($i<=10) {
    print $i++;  // $i wird erst ausgegeben und dann inkrementiert (um eins erhöht)
}

/* Beispiel 2 */
$i=1;
while ($i<=10):
    print $i;
    $i++;
endwhile;


DO ...WHILE

DO ...WHILE-Schleifen sind den WHILE-Schleifen ähnlich, es werden allerdings erst die Anweisungen ausgeführt und dann wird die Bedingung überprüft. Ein kleines Beispiel:
$i=0;
do {
    print $i;
} while ($i>0);    // $i wird genau einmal ausgegeben
Für Pascal/Delphi-Kenner:
Die DO ...WHILE-Schleife ist vom Prinzip her identisch mit REPEAT UNTIL.


FOR

FOR-Schleifen sind die kompliziertesten Schleifen in PHP. Die Syntax ist identisch mit der in C:
FOR (expr1; expr2; expr3) statement
Der erste Ausdruck `expr1` wird genau einmal, am Anfang, ausgeführt. Damit initialisiert man in der Regel die Variable.
Der zweite Ausdruck `expr2` wird am Anfang jedes Schleifendurchlaufs überprüft. Wenn die Bedingung erfüllt ist, wird die Schleife ausgeführt, wenn nicht, wird abgebrochen. Das ist die Laufbedingung.
Am Ende jedes Schleifendurchlaufs wird der dritte Ausdruck `expr3` ausgeführt.
Jeder Ausdruck kann auch leergelassen werden.

Analog zu IF müssen mehrere Anweisungen, die zur selben FOR-Schleife gehören, in geschweifte Klammern eingeschlossen werden.

Die FOR-Schleife kann im Prinzip auch mit einer WHILE-Schleife nachgebildet werden. Allgemein ausgedrückt (mit den oben verwendeten Bezeichnern) sähe das dann so aus:

expr1;
while (expr2){
  statement
  expr3;
}

Die folgenden Beispiele geben jeweils die Zahlen von 1 bis 10 aus:

/* Beispiel 1 */
for ($i=1; $i<=10; $i++) {
    print $i;
}

/* Beispiel 2 */
for ($i=1;;$i++) {
    if ($i > 10) {
      break;
    }
    print $i;
}

/* Beispiel 3 */
$i=1;
for (;;) {
    if ($i>10) {
      break;
    }
    print $i;
    $i++;
}

/* Beispiel 4 */
$i=1;
while ($i<=10){
  print $i;
  $i++;
}
Das erste Beispiel ist natürlich das geschickteste. Im vierten Beispiel ist die FOR-Schleife mit Hilfe von WHILE nachgebildet worden. Wir sehen als erstes die Initialisierung ($i wird auf 1 gesetzt). Die WHILE-Schleife läuft so lange, wie die Laufbedingung erfüllt ist ($i muß kleiner/gleich 10 sein). Dann kommt die eigentliche Anweisung (Ausgabe der Variablenwerte) und als letztes wird $i inkrementiert[*].

Mit break wird die aktuelle Schleife verlassen.


SWITCH

Die Funktion der SWITCH-Anweisung ist identisch mit der der CASE OF-Anweisung in Pascal/Delphi. Die Anweisung ist ähnlich einer Serie von IF-Anweisungen mit denselben Ausdrücken. In vielen Situationen will man eine Variable oder einen Ausdruck mit vielen Werten vergleichen und abhängig von den Werten der Variablen unterschiedliche Befehle ausführen. Genau das erreicht eine SWITCH-Anweisung.

Hier zwei Beispiele, die dasselbe Ergebnis ausgeben - einmal mit einer Reihe von IF-Anweisungen und einmal mit einer SWITCH-Anweisung gelöst:

/* Beispiel 1 */
if ($i == 0) {
  print "i ist gleich 0";
}
if ($i == 1) {
  print "i ist gleich 1";
}

/* Beispiel 2 */
switch ($i) {
  case 0:
    print "i ist gleich 0";
    break;
  case 1:
    print "i ist gleich 1";
    break;
}

Es ist wichtig zu wissen, wie die SWITCH-Anweisung arbeitet, um Fehler zu vermeiden. Bei der SWITCH-Anweisung wird Zeile für Zeile (wirklich, Anweisung für Anweisung!) abgearbeitet. Am Anfang wird kein Code ausgeführt. Nur dann, wenn eine CASE-Anweisung mit einem Wert gefunden wird, der gleich dem Wert der SWITCH-Ausdruckes ist, fängt PHP an, die Anweisungen auszuführen. PHP fährt fort, die Anweisungen bis an das Ende des SWITCH-Blockes auszuführen oder, bis es das erste Mal auf eine BREAK-Anweisung stößt. Wenn man keine BREAK-Anweisung an das Ende einer CASE-Anweisung schreibt, fährt PHP fort, Anweisungen über den folgenden Fall auszuführen. Z.B.:

/*Beispiel 3 */
switch ($i) {
  case 0:
    print "i ist gleich 0";
  case 1:
    print "i ist gleich 1";
}

Falls $i gleich 0 sein sollte, würden beide Anweisungen ausgegeben, was in diesem Fall nicht erwünscht wäre.

Dieses Verhalten kann aber auch bewußt genutzt werden, wie man in den folgenden Fällen sieht:

/*Beispiel 4 */
switch($i) {
  case 0:
    print "i ist gleich 0";
    break;
  case 1:
  case 2:
    print "i ist gleich 1 oder 2";
}

/*Beispiel 5 */
switch($i) {
  case 0:
    print "i ist gleich 0";
  case 1:
  case 2:
    print "i ist gleich 0 oder 1 oder 2";
}

Ein spezieller Fall ist der default-Fall. Dieser Fall trifft auf alles zu, was nicht von den anderen Fällen abgedeckt wird.

/* Beispiel 6 */
switch ($i) {
  case 0:
    print "i ist gleich 0";
    break;
  case 1:
    print "i ist gleich 1";
    break;
  default:
    print "i ist ungleich 0, 1";
}


include

Der Befehl
include("dateiname");
fügt an dieser Stelle den Inhalt der Datei `dateiname` ein. Dadurch ist es möglich, Quellcode, der in mehreren Dateien benötigt wird, zentral zu halten, so daß Änderungen einfacher werden.

Die Datei, die eingefügt wird, wird als HTML-Code interpretiert, deshalb muß, wenn in der Datei nur PHP-Code steht, diese Datei mit <?php anfangen und mit ?> aufhören (bzw. mit anderen PHP-Code-Markierungen, siehe Kapitel 6.2).

Wenn include() in Verbindung mit Bedingungen oder Schleifen eingesetzt wird, muß es immer in geschweiften Klammern geschrieben werden.

/* So ist es falsch */
if ($Bedingung)
  include("Datei.inc");

/* So ist es richtig */
if ($Bedingung){
  include("Datei.inc");
}


require

Ganz analog zu include() funktioniert require(). Es wird aber von PHP etwas anders behandelt. Der require()-Ausdruck wird beim ersten Aufruf durch die Datei ersetzt. Wie bei include() wird erst einmal aus dem PHP-Modus gesprungen. Es gibt drei wesentliche Unterschiede zu include(): Zum einen wird require() immer ausgeführt, also auch dann, wenn es eigentlich abhängig von einer IF-Bedingung nicht ausgeführt werden dürfte, und zum anderen wird es innerhalb einer Schleife (FOR, WHILE) nur ein einziges Mal ausgeführt - egal, wie oft die Schleife durchlaufen wird (trotzdem wird der Inhalt der eingefügten Datei mehrmals abgearbeitet). Der dritte Unterschied liegt in der Reaktion auf nicht vorhandene Dateien: include() gibt nur ein ,,Warning`` aus und PHP läuft weiter, bei require() bricht PHP mit einem ,,Fatal error:`` ab.

Beispiele zu include und require

Es gibt im selbem Verzeichnis, in dem das PHP-Script liegt, noch folgende Dateien:

test.txt

Dies ist ein einfacher Text.<br>
Die Variable i hat den Wert <?php echo $i; ?>.<br>

test1.txt

Datei test1.txt

test2.txt

Datei test2.txt

Aber jetzt zu den Beispielen:

echo "Erstmal ein einfaches include/require<br>\n";
$i = 5;
include("test.txt");
require("test.txt");

Die Ausgabe des Scripts ist, wie zu erwarten, folgende:

Erstmal ein einfaches include/require<br>
Dies ist ein einfacher Text.<br>
Die Variable i hat den Wert 5.<br>
Dies ist ein einfacher Text.<br>
Die Variable i hat den Wert 5.<br>

Auch in Schleifen können include() und require() verwendet werden.

echo "\nKleine for-Schleife für include<br>\n";
for ($i=1;$i<=3;$i++){
  include("test.txt");
}
echo "\nKleine for-Schleife für require<br>\n";
for ($i=1;$i<=3;$i++){
  require("test.txt");
}

Auch hier ist die Ausgabe, wie zu erwarten:

Kleine for-Schleife für include
Dies ist ein einfacher Text.
Die Variable i hat den Wert 1.
Dies ist ein einfacher Text.
Die Variable i hat den Wert 2.
Dies ist ein einfacher Text.
Die Variable i hat den Wert 3.
Kleine for-Schleife für require
Dies ist ein einfacher Text.
Die Variable i hat den Wert 1.
Dies ist ein einfacher Text.
Die Variable i hat den Wert 2.
Dies ist ein einfacher Text.
Die Variable i hat den Wert 3.

Als letztes ein Beispiel, wo man einen Unterschied zwischen include() und require() sehen kann:

echo "\nKleine for-Schleife für include<br>\n";
for ($i=1;$i<=3;$i++){
  include("test$i.txt");
}
echo "\nKleine for-Schleife für require<br>\n";
for ($i=1;$i<=3;$i++){
  require("test$i.txt");
}

Hier gibt es eine Unterschied zwischen PHP3 und PHP4. Die Ausgabe bei PHP3 ist folgende:

Kleine for-Schleife für include<br>
Datei test1.txt
Datei test2.txt
<br>
<b>Warning</b>:  Failed opening 'test3.txt' for inclusion in <b>....

Kleine for-Schleife für require<br>
Datei test1.txt
Datei test1.txt
Datei test1.txt

Die Ausgabe von PHP4:

Kleine for-Schleife für include<br>
Datei test1.txt
Datei test2.txt
<br>
<b>Warning</b>:  Failed opening 'test3.txt' for inclusion (include_path='') in <b>....

Kleine for-Schleife für require<br>
Datei test1.txt
Datei test2.txt
<br>
<b>Fatal error</b>:  Failed opening required 'test3.txt' (include_path='') in <b>....

Die include()-Anweisung wird bei PHP3 und PHP4 identisch behandelt. In beiden Fällen wird versucht die Datein ,,test1.txt``,,,test2.txt`` und ,, test3.txt`` einzufügen, wobei letzteres mangels vorhandener Datei nicht funktioniert.

Bei require() sieht das ganze etwas anders aus. PHP3 verhält sich, wie ich es erwartet habe. Die Datei wird einmal eingefügt und dann wird der Inhalt der Datei mehrmals aufgerufen. Bei PHP4 verhält sich die require() merkwürdigerweise wie die include() Anweisung. :-/


include_once, require_once

Seit PHP4 gibt es neben include() und require() auch noch die Funktionen include_once() und require_once(). Der Name zeigt schon, wo der Unterschied ist. Bei den *_once() Funktionen wird die Datei nur einmal eingefügt, unabhängig davon, wie häufig man versucht, sie einzufügen.

Das ganze hat einen ganz einfachen Sinn. Bei umfangreichen Webseiten gibt es häufig eine Datei, die die zentralen Funktionen enthält. Da diese in den Webseiten benötigt werden, fügt man sie immer am Anfang ein. Soweit kein Problem. Sobald aber mehrere zentrale Funktionsdateien existieren, die sich auch untereinander benötigen, wird es schwierig, weil jede nur einmal eingefügt werden darf.


Funktionen

Funktionen dienen dem Zusammenfassen mehrerer Befehle zu einem Aufruf. Dadurch werden Programme einfacher lesbar, weil klar ist, wozu ein Befehlsblock dient.

Bei einigen Programmiersprachen findet eine Unterscheidung zwischen Funktionen, die einen Wert zurückgeben und solchen, die keinen Wert zurückgeben statt. Z.B. in Pascal/Delphi gibt es neben den sog. Funktionen, die einen Wert zurückgeben, sog. Prozeduren, die keinen Wert zurückgeben. PHP macht hier, genau wie C und C++, keinen Unterschied.

Die Syntax lautet wie folgt:

function foo($arg_1, $arg_2, ..., $arg_n) {
  echo "Example function.\n";
  return $retval;
}
Die Funktion bekommt die Argumente `Arg_1` bis `Arg_n` übergeben und gibt den Wert der Variablen `retval` zurück. Wird kein `return` in der Funktion benutzt, hat man dasselbe Verhalten wie bei einer Prozedur in Pascal/Delphi. Rückgabewerte müssen nicht abgefragt werden.

Ein kleines Beispiel:

function my_sqr($num) {  // liefert das Quadrat von $num zurück
    return $num * $num;
}
echo my_sqr(4);          // gibt 16 aus
my_sqr(4);               // ruft die Funktion auf, es passiert aber nichts

Variablenparameter

Normalerweise werden in PHP Werteparameter[*] übergeben. Will man jedoch die Änderungen der Parameter in der Funktion auch in der aufrufenden Funktion haben, muß man mit Variablenparametern[*] bzw. Referenzparametern[*]arbeiten.

Variablenparameter werden mit einem `&` im Funktionskopf gekennzeichnet.

Ein kleines Beispiel:

function foo1 ($st) {
  $st .= 'und etwas mehr.';  // gleichbedeutend mit $st = $st.'und etwas mehr.';
}

function foo2 (&$st) {
  $st .= 'und etwas mehr.';
}

$str = 'Dies ist ein String, ';
echo $str;		// Ausgabe: 'Dies ist ein String, ';
foo1 ($str);
echo $str;		// Ausgabe: 'Dies ist ein String, ';
foo2 ($str);
echo $str;		// Ausgabe: 'Dies ist ein String, und etwas mehr.';


next up previous contents index
Next: PHP & HTML Up: Einführung PHP Previous: Einführung PHP
Christoph Reeg(http://reeg.net/)