Stand: 14.05.2019

Lernziele

Links zu PHP:

11.1 Einführung

Bisher haben wir uns ausschließlich mit dem Client beschäftigt. Konkret ist das der Browser eines Benutzers, der eine Webseite aufruft (per Anfrage an einen Server). Der Browser stellt die Webseite dar, indem er HTML/CSS in Grafik umsetzt und gegebenenfalls auch JavaScript-Code ausführt. Dieser ganze Bereich wird auch Frontend-Programmierung genannt, denn hier wird der Code erst auf der Seite des Clients - also im Frontend - ausgeführt.

Frontend und Backend

Der Client bekommt die Webseite von einem Server, der bislang nichts weiter tut als HTML/CSS/JavaScript-Dateien an den Client zu schicken. Der Server kann aber auch Code ausführen, wenn er eine Anfrage bekommt, und dann erst die Webseite zusammenbauen, oft mit Hilfe von Informationen aus einer Datenbank. Diesen Bereich nennt man Server-Programmierung (oder serverseitige Programmierung oder Backend-Programmierung). Das Programm, das auf dem Server läuft, nennt man auch manchmal das Backend. Wichtig ist, dass der Client den Code nie zu Gesicht bekommt, was aus Sicherheitsgründen ein wichtiger Aspekt ist. Eine verbreitete Programmiersprache zur Backend-Programmierung ist PHP:

Backend-Programmierung

Webapplikation

In der Kombination aus dynamischen Frontend und zentralem Backend lassen sich mächtige Applikationen, so genannte Webapplikationen herstellen, von Chat-Systemen über gemeinsame Dokumentbearbeitung und Online-Shop bis hin zum sozialen Netzwerk. Ein weiteres Beispiel ist ein Blog. Dort werden bei jedem Aufruf auf dem Server die 5 aktuellsten Beiträge aus der Datenbank ausgelesen und zu einer HTML/CSS-Seite zusammengebaut. Im Frontend sorgt JavaScript-Code für Animationen innerhalb der Benutzerschnittstelle.

PHP

Welche Programmiersprache läuft auf dem Server? Eine der ersten Sprachen ist PHP (rekursives Akronym "PHP is a Hypertext Preprocessor"). Heutzutage verwendet man auch Python, Java, Ruby und andere. Immer populärer wird auch JavaScript als serverseitige Sprache, weil Webentwickler dann nur eine Sprache für Frontend und Backend lernen müssen.

Obwohl PHP eine - für Internetverhältnisse - sehr alte Sprache ist (veröffentlicht 1995), ist sind immer noch die am weitesten verbreitete serverseitige Programmiersprache im Web.

PHP-Systeme

Die hohe Verbreitung von PHP trotz der vielen Alternativen liegt sicher daran, das einige der am meisten genutzen Content-Management-Systemen in PHP geschrieben sind, u. a. auch Wordpress, Typo3 und Joomla.

Weitere Beispiele für PHP-Systeme sind

11.2 Technische Einrichtung

11.2.1 Server-Software

Zunächst müssen Sie dafür sorgen, dass Ihr Computer muss zum Server wird. Ein Server ist ein Programm, dass die Netzwerkverbindung überwacht und Requests (von außen, aber auch vom eigenen Rechner) empfängt und gegebenenfalls beantwortet. Nebenbei bemerkt: der Begriff "Server" wird auch für die Hardware oder für das Gesamtsystem aus Hardware und Software verwendet, wenn man z. B. sagt "das Dokument liegt auf dem Server von Google".

Bleiben wir bei der Serversoftware. Eine bekannte Serversoftware ist der Apache HTTP Server, da es sich um freie Software handelt. Zwei ähnlich verbreitete, kommerzielle Server sind Microsoft IIS (Microsoft Internet Information Services) und der Google Web Server.

Damit Sie die in diesem Kapitel beschriebenen Techniken testen können, müssen Sie also einen eigenen Server auf Ihren Laptop installieren. Beim Testen schickt dann Ihr Frontend (der Browser) Nachrichten an die von Ihnen installierte und gestartete Server-Software. Ihr Laptop ist also gleichzeitig Client und Server.

Client und Server

11.2.2 XAMPP

Für unsere Zwecke suchen wir eine Serversoftware und später auch noch eine Datenbank-Software. Glücklicherweise gibt es ein Gesamtpaket namens XAMPP, das genau das liefert. Es enthält u. a. die folgenden Komponenten:

Entwickeln und Testen

XAMPP wurde als System zum Entwickeln und Testen von Websystemen entwickelt. Es geht nicht darum, dass Sie Ihren Laptop als Server für irgendwelche weltweit verfügbaren Dienste anbieten. Das würde schnell Ihren Rechner überlasten oder Hackerangriffe anziehen. Stattdessen nutzen Sie die Software, um eine Interaktion mit einem "echten" Server zu testen. Sie sollten tatsächlich XAMPP nicht als "echten Server" (also für Dienste für Dritte) verwenden, sondern nur zum Entwickeln und Testen.

Deployment

Nach Abschluss Ihrer Entwicklungsarbeit - wenn alles funktioniert -, laden Sie Ihr Programm auf einen externen Server hoch, z. B. auf den Server Ihrer Hochschule oder den Server eines Providers, bei dem Sie Ihre Domain gemietet haben. Das nennt man auch Deployment Dort bekommen Sie meist auch eine SQL-Datenbank, die Sie dann anstelle der XAMPP-Datenbank verwenden. XAMPP ist dann im laufenden System gar nicht mehr vorhanden.

Aber jetzt nochmal zurück zu Ihrer lokalen Testumgebung.

Server starten

Nachdem Sie XAMPP für Ihr Betriebssystem installiert haben, starten Sie XAMPP. Sie sehen eine kleine Kontrolloberfläche. Auf einem Mac sieht das so aus:

XAMPP

Unter Windows sieht es eher so aus (starten Sie xampp-control.exe):

XAMPP unter Windows

Auf dem Mac wechseln Sie auf den Reiter "Manage Servers":

Sie sehen unterschiedliche Dienste, die einzeln gestartet werden können. Es kann dann jeweils einen Moment dauern, bis ein Dienst auf grün geschaltet wird. Wir benötigen zunächst "Apache Web Server" (das ist die Server-Software), später auch "MySQL Database" (das ist die Datenbank). Starten Sie ruhig beides und warten Sie, bis die Dienste auf grün schalten.

XAMPP

Die Oberfläche lassen Sie einfach laufen.

Im Browser

Jetzt können Sie in einem Browser (z. B. Firefox) über die URL "http://localhost" auf Ihren eigenen Apache-Server zugreifen, den Sie über XAMPP gestartet haben.

XAMPP

Eigene Dateien

Finden Sie das Verzeichnis /htdocs auf Ihrer Festplatte. Auf einem Mac finden Sie es unter Programme > XAMPP. Unter Windows installieren Sie XAMPP z. B. direkt unter C:. Dann finden Sie innerhalb von C:\XAMPP auch htdocs.

Dieses Verzeichnis ist über das Internet zugänglich. Da Sie auf demselben Rechner sind wie Ihr Server, geben Sie als URL "localhost" an. Wenn Sie eine Testdatei "test.html" im Verzeichnis /htdocs anlegen, können Sie im Browser mit http://localhost/test.html die Datei aufrufen und betrachten.

XAMPP testen mit HTML

Sie könnten sich fragen: Ich kann doch auch sonst eine HTML-Datei in meinen Browser ziehen und betrachten - was ist der Unterschied? Der Unterschied ist, dass jetzt Ihre Datei über eine HTTP-Anfrage (also "übers Internet") angefordert wird (ein sog. Request) und dann der Server auf diese Anfrage antwortet (sog. Response), indem er die Datei - ebenfalls über HTTP - zurückschickt.

Client und Server auf eigenem Laptop

Interessant wird es, wenn vor dem Zuschicken der HTML-Datei (Response) diese Datei noch angepasst wird, indem PHP-Code ausgeführt und z. B. Datenbank- oder Datei-Inhalte abgerufen und eingebaut werden.

11.3 Erste Schritte

Erstellen Sie jetzt eine Datei mit der Endung .php z. B. test.php und stellen Sie sie ins /htdocs Verzeichnis.

11.3.1 Syntax

Da PHP-Code fast immer zusammen mit HTML-Code auftritt, werden PHP-Codeteile gekennzeichnet.

In Ihre Testdatei schreiben Sie:

<?php
 echo 'hello world';
?>

Die erste und letzte Zeile bilden den Rahmen, um anzuzeigen, dass hier PHP steht. Die mittlere Zeile enthält dann einen PHP-Befehl, nämlich echo - das ist wie "print" in Java einfach eine Ausgabe. Allerdings sind hier keine Klammern notwendig. Die Anführungszeichen können einfach oder doppelt sein und am Ende schließen wir den Befehl mit einem Semikolon ab.

Das hier geht also auch:

<?php
 echo "hello world";
?>

Wir werden später noch sehen, was für Unterschiede es zwischen einfachen und doppelten Anführungszeichen gibt.

Genau bedeutet es, dass echo etwas "ausgibt"? Sie können sich das so vorstellen, dass PHP über die Datei test.php drübergeht und den kompletten mit <?php ... ?> eingeklammerten Teil durch das ersetzt, was der echo-Befehl eben sagt (es können auch mehrere echo-Befehle sein). Deswegen auch PHP als "Hypertext Preprocessor": Eine Datei wird zunächst durch PHP "vorverarbeitet", bevor sie z. B. übers Internet an einen Client (etwa Ihr Laptop) geschickt wird.

Wenn Sie in Ihrem Browser also die URL localhost/test.php eingeben, sollten Sie das sehen:

XAMPP testen mit PHP

Wie zu Beginn gesagt, muss dazu Ihre Datei test.php im Verzeichnis htdocs liegen.

11.3.2 PHP und HTML

PHP wurde dazu entwickelt, innerhalb von HTML-Dateien bestimmten "Regionen" automatisch zu befüllen. Daher kann man PHP-Code einfach in ein HTML-Dokument einfügen. Der PHP-Code wird dann ausgeführt und durch die Ausgabe (per echo) ersetzt. Die Datei muss dennoch die Endung .php haben.

Wir erzeugen eine neue Datei test2.php im Verzeichnis htdocs und schreiben folgenden Mix aus HTML und PHP:

<!DOCTYPE html>
<html>
<body>
  <?php
    echo 'hello world';
  ?>
</body>
</html>

In der Datei wird zunächst der PHP-Teil ausgewertet und durch das Resultat ersetzt. Erst dann wird die Datei an den Browser weitergegeben. Wenn Sie die Datei im Browser öffnen und sich den Quelltext anschauen, sehen Sie entsprechend kein PHP mehr, denn beim Client kommt nur das Resultat der Ersetzungen an:

<!DOCTYPE html>
<html>
<body>
  hello world
</body>
</html>

Der Client sieht also gar nicht, woher das "hello world" ursprünglich kam (aus einem Stückchen PHP-Code). Das ist ein großer Vorteil serverseitiger Programmierung: es werden fertige HTML-Dateien ausgeliefert, ohne dass Code sichtbar ist, der evtl. ausspioniert oder kopiert werden könnte und der z. B. sensible Infos wie Passwörter beinhalten könnte.

Sie können im PHP-Code auch HTML-Tags einarbeiten:

<?php
  echo '<h1>hello world</h1>';
?>

Entsprechend steht später im HTML-Code:

<h1>hello world</h1>

Im Browser sehen Sie (Datei test2.php):

XAMPP testen mit PHP im HTML

PHP an verschiedenen Stellen

PHP kann an beliebigen Stellen im HTML vorkommen. Hier sehen Sie PHP z. B. bei den CSS-Stilangaben bei color:

<!DOCTYPE html>
<html>
<head>
  <style media="screen">
    h1 {
      color: <?php echo 'blue' ?>;
    }
  </style>
</head>
<body>
  <?php
    echo '<h1>hello world</h1>';
  ?>
</body>
</html>

Kommentare

Zeilenkommentare werden mit # gekennzeichnet:

<?php
  # Zeilenkommentar

  echo '<h1>hello world</h1>';
?>

Blockkommentare können mehrere Zeilen umfassen und werden mit /* und */ eingeklammert:

<?php
  /*
    Längere Angelegenheit
    über zwei Zeilen
  */

  echo '<h1>hello world</h1>';
?>

11.3.3 Dateien einbinden

Eine sehr wichtige Vorgehensweise in PHP ist das Auslagern von Code, der von mehreren Dateien benötigt wird. Wenn wir z. B. den Header einer Datei in eine separate Datei "header.php" auslagern, benötigen wir den Befehl include, um diesen Code in die aktuelle Datei einzubinden.

Befinden wir uns also in einer Datei und möchten den Code von "header.php" einbinden, schreiben wir:

<?php
  include 'header.php';
?>

Die Datei muss sich im Beispiel im gleichen Verzeichnis befinden. Wenn sich die Datei im Elternverzeichnis (also "eins drüber") befindet, schreiben wir:

<?php
  include '../header.php';
?>

Wenn sich die Datei im Unterzeichnis private vom Elternverzeichnis befindet, schreiben wir:

<?php
  include '../private/header.php';
?>

Wichtig: Es ist empfohlen, an solchen Stellen immer einfache Anführungszeichen zu verwenden, weil der Ersetzungsmechanismus bei doppelten Anführungszeichen zu Sicherheitsproblemen führen kann.

require und require_once

Statt include können Sie auch require verwenden. Bei letzterem wird eine Fehlermeldung ausgegeben, wenn die Datei nicht vorhanden ist. require wird häufig benutzt, um z. B. eine Bibliothek von eigenen Hilfsfunktionen einzubinden.

<?php
  require 'functions.php';
?>

Gerade bei Funktionen sollte man darauf achten, dass man diese nur einmal lädt. Dafür gibt es require_once und include_once. PHP checkt also vorher, ob die Datei bereits geladen wurde und ignoriert die Anweisung in diesem Fall:

<?php
  require_once 'functions.php';
?>

11.4 Daten

11.4.1 Variablen

Sie können in PHP auch Variablen verwenden. Variablen müssen mit einem Dollarzeichen beginnen und können u. a. Zahlen und Strings enthalten.

Im Gegensatz zu Java müssen Sie bei PHP keinen Typ angeben. Stattdessen "errät" PHP den Typ.

<?php
  $foo = 'Harry';
  $bar = 'Sally';
  $num = 42;
?>

Im obigen Beispiel sind die Variablen $foo und $bar vom Typ String, wohingegen $num eine ganze Zahl ist.

Sie haben in PHP die folgenden (primitiven) Datentypen:

Eine boolesche Variable kann - wie in Java - die Werte true oder false enthalten.

Rechenoperationen

Variablen kann man auch mit Zahlen füllen und man kann Rechenoperationen durchführen:

<?php
  $x = 5;
  $y = 6;
  $z = $x + $y;
?>

Wie in Java gibt es die Operatoren += und ++ und die entsprechenden Operatoren für die anderen Operationen, also -=, *=, /=, und natürlich das --.

11.4.2 Strings

Strings sind in PHP besonders wichtig, da es bei PHP ursprünglich darum ging, Textschnipsel für das finale HTML-Dokument zu erzeugen.

String-Konkatenation

Um Strings aneinander zu reihen, verwenden Sie den Punkt. Das ist also wie das Plus-Zeichen in Java und nennt sich String-Konkatenation:

<?php
  $foo = 'Harry';
  $bar = 'Sally';
  echo 'We are ' . $foo . ' and ' . $bar;
?>

Einfache und doppelte Anführungszeichen

Eine Besonderheit ist, dass Sie die Variablen auch innerhalb des Strings verwenden können:

<?php
  $foo = 'Harry';
  $bar = 'Sally';
  echo "We are $foo and $bar";
?>

Dies geht allerdings nur bei doppelten Anführungszeichen (engl. double quotes). Dort sucht und ersetzt PHP Variablen innerhalb des Strings. Der obige String wird also zu:

We are Harry and Sally

Bei einfachen Anführungszeichen (single quotes) werden Variablen nicht ersetzt:

echo 'We are $foo and $bar';

wird zu:

We are $foo and $bar

Manchmal ist es sinnvoll, einfache und doppelte Anführungszeichen zu kombinieren, z. B. wenn Sie ein HTML-Element ausgeben wollen, das Anführungszeichen beinhaltet:

<?php
  echo '<img src="img/foo.png" alt="Bild eines Foo" />';
?>

Sie können sowohl doppelte Anführungszeichen innerhalb von einfachen verwenden als auch umgekehrt einfache innerhalb von doppelten.

Maskieren von Zeichen

Bei einfachen Anführungszeichen stellt sich die Frage, ob man auch ein einfaches Anführungszeichen ausgeben kann:

echo 'das Wort 'laufen' ist ein Verb.';

Wir haben hier das Problem, dass PHP denkt, dass nach dem zweiten Anführungszeichen der String zu Ende ist. Also müssen wir die "inneren" Anführungszeichen kennzeichnen - das nennt man auch maskieren - und zwar mit einem vorangestellten Backslash:

echo 'das Wort \'laufen\' ist ein Verb.';

Das zweite Zeichen, das wir maskieren können, ist der Backslash selbst:

echo 'das Zeichen \\ nennt man einen Backslash.';

Diese beiden Zeichen sind bei Strings mit einfachen Anführungszeichen die einzigen maskierbaren Zeichen.

Bei Strings mit doppelten Anführungszeichen haben wir noch viele weitere maskierbare Zeichen:

\" für doppelte Anführungszeichen
\n für Zeilenumbruch
\t für Tabulator

Schauen Sie gern im PHP Manual / Strings nach weiteren Infos zu diesem Thema.

11.4.3 Arrays

In einem Array kann man eine Reihe von Daten speichern und systematisch (in der Regel mit einer Schleife) auf diese Elemente zugreifen. In PHP gibt ein zwei Arten von Arrays. Indizierte Arrays sind ähnlich zu den Arrays, die Sie von Java kennen. Allerdings können Sie in PHP einen Array jederzeit erweitern, d. h. ein Array in PHP funktioniert auch wie eine Liste in Java (z. B. die Klasse ArrayList).

Assoziative Arrays entsprechen den assoziativen Arrays in JavaScript oder einer Hashtabelle in Java (z. B. die Klasse HashMap). Bei einem assoziativen Array verwendet man keine Indexzahlen für den Zugriff, sondern einen String.

Indizierte Arrays

Ein Array enthält eine Reihe von Daten, die mit Indexzahlen durchnummeriert sind - beginnend mit 0.

Einen neuen Array erstellt man wie folgt:

$arr = array('bla', 'blubb', 'blabla');

Im Gegensatz zu Java, kann man in PHP einen Array jederzeit erweitern. Um ein neues Element an das Ende des Arrays anzufügen, schreibt man:

$arr[] = 'blip';

Man kann auch einen leeren Array erstellen und anschließend befüllen:

$arr = array();
$arr[] = 'bla';
$arr[] = 'blubb';
$arr[] = 'blabla';

Auf Einzelelemente greift man - wie in Java - mit eckigen Klammern und dem Index zu. Um das zweite Element auszugeben, schreibt man:

echo $arr[1];

Die Länge des Arrays bekommt man mit der Funktion count:

echo count($arr);

Eine Schleife zum Durchlaufen eines Arrays kann man sehr elegant mit der Foreach-Schleife formulieren (hier wird $a als Laufparameter deklariert):

foreach ($arr as $a) {
  echo $a . ' ';
}

Das Durchlaufen eines Arrays nennt man auch Traversieren.

Man kann auch eine reguläre For-Schleife verwenden:

for($i = 0; $i < count($arr); $i++) {
    echo $arr[$i] . ' ';
}

Assoziative Arrays

Assoziative Arrays funktionieren ähnlich wie in JavaScript. Typisches Beispiel ist ein Telefonbuch vor, wo Namen und Telefonnummern gespeichert werden. Der Zugriff auf eine Nummer soll hier über den Namen laufen.

In PHP erstellt man einen assoziativen Array wie folgt:

$tel = array("Heinz Schmidt" => "4561", "Laura Kaiser" => "3355", "Donna Leon" => "4321");

Man nennt die eigentliche Information im Array den Wert (hier die Telefonnummer) und den Zugriffs-String den Schlüssel (hier der Name). Die Pfeile sollen andeuten, dass es sich hier um eine Abbildung von Schlüssel auf Wert handelt. Wie immer ist es egal, ob Sie einfache oder doppelte Anführungszeichen verwenden.

Der Zugriff auf ein Einzelelement erfolgt über den Schlüssel. Die Schreibweise ist exakt so wie in JavaScript:

echo 'Lauras Nummer ist: ' . $tel['Laura Kaiser'];

Anders als in JavaScript gibt es in PHP eine spezielle Foreach-Schleife, um alle Schlüssel und Werte gleichzeitig zu durchlaufen. Man definiert zwei Laufvariablen für jeweils Schlüssel und Wert.

foreach ($tel as $name => $nummer) {
  echo $name . ' hat Nummer ' . $nummer . ' ';
}

11.4.4 Konstanten

Konstanten werden - wie in Java - komplett großgeschrieben und mit dem Befehl define gesetzt. Ungewöhnlich ist, dass der Name der Konstanten in Anführungszeichen gesetzt werden muss (einfach oder doppelt):

define("MEANING_OF_LIFE", 42);

Sie sehen, dass hier kein Dollarzeichen nötig ist. Ansonsten kann man Konstanten wie normale Variablen einsetzen:

$x = 10 * MEANING_OF_LIFE;
echo 'Meaning of life: ' . MEANING_OF_LIFE;

Nicht verwenden kann man die Variablenersetzung bei doppelten Anführungszeichen:

echo "Meaning of life: MEANING_OF_LIFE";

Wird zu

Meaning of life: MEANING_OF_LIFE

11.4.5 Superglobale Variablen

Es gibt eine Reihe von Systemvariablen, die aus jedem Kontext aus erreichbar sind, und die superglobale Variablen oder engl. einfach superglobals genannt werden. Die Variablen enthalten System- oder Prozessinformationen in Form von assoziativen Arrays.

Die häufigste Anwendung ist das Auslesen der Benutzereingabe über Formulare, deren Inhalte über HTTP verschickt und empfangen werden (zur Anwendung kommen dann die Superglobals $_GET oder $_POST).

Eine gute Übersicht über Superglobals finden Sie auch bei https://www.w3schools.com/php/php_superglobals.asp.

Die Variable $GLOBALS enthält zum Beispiel alle globalen Variablen und ihre Werte. Haben Sie z. B. die globale Variable $foo, so können Sie sie mit

echo $GLOBALS['foo'];

auslesen und mit

$GLOBALS['foo'] = 42;

neu setzen.

Weitere superglobale Variablen liefern von Systemseite Informationen über den Web-Kontext:

Sie können z. B. mit

echo $_SERVER['SERVER_NAME'];

den Namen des Servers ausgeben lassen, auf dem der PHP-Code ausgeführt wurde (z. B. 'www.hs-augsburg.de').

Am häufigsten kommen diese Variablen in Zusammenhang mit Web-Formularen und den daraus resultierenden HTTP-Requests vor, wie wir im nächsten Kapitel sehen werden.

11.5 Kontrollfluss

11.5.1 Bedingte Anweisungen

If-Anweisung

Es gibt wie in Java das einfache if, das if-else und das if-else-if. In der Bedingung nutzen Sie wie in Java Vergleichsoperatoren wie >, <, >= und <=. Um auf Gleichheit zu prüfen, verwenden Sie das doppelte Gleichheitszeichen ==, für Ungleichheit mit Negationszeichen !=.

Ein Beispiel für if:

$is_male = true;
$name = 'Müller';

$greeting = 'Hallo, Frau ' . $name;
if ($is_male) {
  $greeting = 'Hallo, Herr ' . $name;
}

Ein Beispiel für ein if-else:

$is_male = true;
$name = 'Müller';

if ($is_male) {
  $greeting = 'Hallo, Herr ' . $name;
} else {
  $greeting = 'Hallo, Frau ' . $name;
}

Und noch ein Beispiel für ein if-else-if:

$points = 95;

if ($points > 90) {
  echo 'Klausur mit Auszeichnung bestanden.';
} else if ($points > 70) {
  echo 'Klausur gut bestanden.';
} else if ($points > 50) {
  echo 'Klausur bestanden.';
} else {
  echo 'Leider durchgefallen.';
}

Gleichheit prüfen mit == oder ===

In PHP gibt es zusätzlich zum Vergleichsoperator == noch den Operator === (und analog die Negation !==). Der Unterschied ist, dass bei == der Wert der beiden Seiten vergleichen wird, unabhängig vom Typ. Steht also links eine Zahl und rechts ein String

'42' == 42

wird das ganze dennoch als true gewertet.

Beim dreifachen Gleichheitszeichen === muss auf beiden Seiten sowohl der Wert als auch der Typ übereinstimmen. Hier kommt also false raus:

'42' === 42

Und hier true:

42 === 42

Ternärer Operator

Wie in Java gibt es den ternären Operator, der eine If-Anweisung durch ein kurzes Konstrukt ersetzt.

Nehmen wir an, wir haben zwei Variablen

$is_male = true;
$name = 'Müller';

Dann können wir eine individuelle Begrüßung erzeugen mit

if ($is_male) {
  $greeting = 'Hallo, Herr ' . $name;
} else {
  $greeting = 'Hallo, Frau ' . $name;
}

Mit dem ternären Operator geht das viel kürzer:

$greeting = ($is_male ? 'Hallo, Herr ' : 'Hallo, Frau ') . $name;

Allgemein ist die Form des ternären Operators:

[Bedingung] ? [Ausdruck A] : [Ausdruck B]

11.5.2 Schleifen

While-Schleife

While-Schleifen sehen exakt so aus wie in Java:

$i = 0;
while ($i < 10) {
  echo $i . ' ';
  $i++;
}

For-Schleife

Auch For-Schleifen können Sie wie in Java formulieren. Sie müssen nur daran denken, dass man in PHP bei Variablen keinen Typen voranstellt, also auch nicht im Kopf der For-Schleife:

for ($i = 0; $i < 10; $i++) {
  echo $i . ' ';
}

11.5.3 Funktionen

Wie in Java gibt es in PHP Funktionen. Die Definition einer Funktion wird mit dem Schlüsselwort function gekennzeichnet:

function sayHello() {
  echo 'hello world';
}

Der Aufruf der Funktion sieht dann z. B. so aus:

<h1>
  <?php sayHello(); ?>
</h1>

Wichtig: Nie das Semikolon vergessen!

Parameter

Funktionen können Parameter haben (mehere Parameter werden durch Komma getrennt):

function sayHello($anrede, $person) {
  echo 'Hello, ' . $anrede . ' ' . $person . '!';
}

Der Aufruf:

<h1>
  <?php sayHello('Frau Dr.', 'Schmidt'); ?>
</h1>

Wie schon bei den Variablen tauchen hier keine Typen auf, weder bei den Parametern noch in Form eines Rückgabetyps.

Rückgabewert

Natürlich können wir - wie in Java - Werte zurückgeben und tun dies - ebenfalls wie in Java - mit dem Schlüsselwort return.

function add($num1, $num2) {
  return $num1 + $num2;
}

Ein möglicher Aufruf:

<p><?php echo '1 plus 2 ist ' . add(1,2); ?></p>

Wohin mit den Funktionen?

Da Ihre Funktionen häufig in mehreren Dateien benötigt werden, ist es üblich, eine eigene Datei (oder mehrere) mit Funktionen anzulegen. Zum Beispiel in einem Unterverzeichnis private die Datei functions.php.

Sie müssen dann in der Datei, in der Sie die Funtionen nutzen wollen, die Datei functions.php einbinden, indem Sie zu Beginn Ihrer Datei schreiben:

<?php
  include 'private/functions.php';
?>

Denken Sie daran, dass Sie auch in functions.php den Rahmen mit <?php ... ?> definieren müssen:

<?php

function sayHello($anrede, $person) {
  echo 'Hello, ' . $anrede . ' ' . $person . '!';
}

function add($num1, $num2) {
  return $num1 + $num2;
}

?>

11.6 Dateien

Sie können in PHP Dateien erzeugen und in die Dateien schreiben bzw. aus Ihnen lesen. Diese Dateien befinden sich natürlich dann auf dem Server und sind für den Endbenutzer (Client) nicht ohne weiteres sichtbar.

Dateien müssen immer erst geöffnet und dann vollzogener Operation (es können auch mehrere sein) geschlossen werden.

Öffnen

Das Öffnen einer Datei kann verschiedene Ziele haben, z. B. eine Datei neu zu erzeugen, eine Datei zu überschreiben oder etwas an eine vorhandene Datei anzuhängen. Dies nennt man auch den Modus des Öffnens.

Zum Öffnen gibt es den Befehl fopen. Sehen wir uns ein Beispiel an, wo eine Datei zum Schreiben (engl. write) geöffnet wird und daher als Modus "w" angegeben wird. Sollte die Datei nicht existieren, wird sie neu erzeugt. Sollte sie existieren, wird sie überschrieben.

<?php
  $file = fopen("mydata.txt", "w") or die("Konnte Datei nicht öffnen!");
  ...
  fclose($file);
?>

Die Klausel or die sorgt im Fehlerfall für eine Ausgabe, genauer gesagt: der angegebene String wird an diese Stelle gesetzt (ähnlich wie bei echo).

Der Befehl fopen gibt einen Zeiger auf die geöffnete Datei zurück, den wir uns in einer Variablen merken. Nach Abschluss unserer Operation(en) schließen wir diese Datei dann mit fclose. Beachten Sie, dass, wenn Sie die Datei nicht schließen, Datenverlust oder Ressourcenprobleme auftreten können.

Die wichtigsten Modi sind:

Beachten Sie, dass bei "w" und "w+" der vorhandene Inhalt überschrieben wird. Verwenden Sie "a" oder "a+", wenn Sie Inhalte anhängen möchten.

Eine vollständige Liste möglicher Modi finden Sie im PHP-Handbuch.

Schreiben

Möchten Sie eine Datei beschreiben, öffnen Sie die Datei in einem schreibfähigen Modus. Wir wählen "a". Dies erzeugt die Datei, falls sie noch nicht existiert und hängt dann Inhalte immer an den bestehen Text an.

Wir verwenden das Kommando fwrite, um einen Text in die Datei zu schreiben und schließen die Datei anschließend.

<?php
  $file = fopen("mydata.txt", "a") or die("Konnte Datei nicht öffnen!");
  fwrite("Hello, world!");
  fclose($file);
?>

Lesen

Möchten Sie aus einer Datei lesen, öffnen Sie die Datei in einem lesefährigen Modus (z. B. "r" oder "w+"). Die Datei muss existieren, sonst tritt ein Fehler auf (den behandeln wir hier wieder mit or die). Das Lesen erfolgt mit fgets. Dieser Befehl liest eine Zeile der Datei, also müssen Sie mit Hilfe einer Schleife alle Zeilen auslesen. Dabei hilft die Abfrage feof (engl. end of file), die dann true wird, wenn das Dateiende erreicht ist.

<?php
  $file = fopen("mydata.txt", "r") or die("Konnte Datei nicht öffnen!");
  while(!feof($file)) {
    echo fgets($file);
  }
  fclose($file);
?>

Wir verwenden echo, um die jeweilige Zeile direkt auszugeben. Vergessen Sie auch hier nicht, die Datei wieder zu schließen.