PHP ist eine der gän­gigs­ten Pro­gram­mier­spra­chen für die ser­ver­sei­ti­ge Pro­gram­mie­rung. Im Laufe der Zeit hat sich PHP zu einem un­ver­zicht­ba­ren Be­stand­teil vieler moderner Websites und In­ter­net­tech­no­lo­gien ent­wi­ckelt. Doch PHP zu lernen kann für Neu­ein­stei­ge­rin­nen und Neu­ein­stei­ger eine große Her­aus­for­de­rung sein. In diesem PHP-Tutorial zeigen wir Ihnen die Grund­la­gen der beliebten Pro­gram­mier­spra­che sowie ihre wich­tigs­ten Ope­ra­to­ren, Schleifen und Funk­tio­nen.

PHP-Tutorial: Was Sie mit­brin­gen sollen

Unser Tutorial richtet sich in erster Linie an Neu­an­fän­ge­rin­nen und Neu­an­fän­ger. Bei manchen Bei­spie­len ist es jedoch hilfreich, über ein Grund­wis­sen der modernen Web­ent­wick­lung sowie HTML zu verfügen. Um die auf­ge­führ­ten Beispiele an Ihrem eigenen Rechner nach­zu­voll­zie­hen, müssen Sie folgende vor­be­rei­ten:

XAMPP

Als Server empfehlen wir für den Einstieg die lokale Test­um­ge­bung XAMPP, die von Apache Friends für die Be­triebs­sys­te­me Windows, Linux und macOS kostenlos zur Verfügung gestellt wird. XAMPP ist ein reiner Test­ser­ver. Web­ent­wick­le­rin­nen und Web­ent­wick­lern bietet das Software-Bundle die Mög­lich­keit, in kürzester Zeit eine komplette Test­um­ge­bung für Skripte, HTML-Seiten und Style­sheets auf­zu­set­zen. Ein sicherer Betrieb als Webserver im Internet ist jedoch nicht ge­währ­leis­tet. Eine aus­führ­li­che In­stal­la­ti­ons­an­lei­tung finden Sie in unserem XAMPP-Tutorial.

Web­hos­ting
Das beste Web­hos­ting zum Spit­zen­preis
  • 3x schneller und 60 % günstiger
  • Maximale Ver­füg­bar­keit mit > 99.99 %
  • Nur bei IONOS: Bis zu 500 GB Spei­cher­platz inklusive

PHP Built-in Server

PHP bringt seit Version 5.4 einen in­te­grier­ten Ent­wick­lungs­ser­ver mit, der sich besonders für einfache Tests und Lern­zwe­cke eignet. Dieser so­ge­nann­te Built-in Server erfordert keine zu­sätz­li­che Server-Software wie Apache oder NGINX. Vor­aus­set­zung ist lediglich eine in­stal­lier­te PHP-Version auf Ihrem System. An­schlie­ßend können Sie den Server direkt über die Kom­man­do­zei­le im Pro­jekt­ver­zeich­nis starten:

php -S localhost:8000
bash

PHP stellt die Dateien im aktuellen Ordner an­schlie­ßend unter der Adresse http://localhost:8000 im Web­brow­ser bereit. Der Built-in Server eignet sich vor allem für erste PHP-Ex­pe­ri­men­te, kleine Test­skrip­te oder das schnelle Nach­voll­zie­hen von Code­bei­spie­len.

Docker und Docker-Compose

Eine etwas an­spruchs­vol­le­re Al­ter­na­ti­ve ist der Einsatz von Docker. Docker er­mög­licht es, Ent­wick­lungs­um­ge­bun­gen in so­ge­nann­ten Con­tai­nern zu kapseln. Dadurch lassen sich Webserver, PHP und Da­ten­ban­ken exakt so kon­fi­gu­rie­ren, wie sie später auch in der Pro­duk­ti­ons­um­ge­bung laufen. Für PHP-Projekte wird häufig Docker-Compose verwendet, um mehrere Dienste gemeinsam zu starten. Die gesamte Kon­fi­gu­ra­ti­on wird in einer Datei („docker-compose.yml)“ fest­ge­hal­ten und kann mit einem einzigen Befehl gestartet werden.

PHP-Grund­la­gen: Die Syntax der Skript­spra­che

Haben Sie Ihren lokalen Webserver (z. B. mithilfe von XAMPP) ein­ge­rich­tet, sollten Sie testen, ob PHP korrekt in­stal­liert wurde und bereit ist, Skripte aus­zu­füh­ren. Ein Skript ist ein Programm, das nicht vorab in Binärcode kom­pi­liert wird. Statt­des­sen werden sie von einem In­ter­pre­ter aus­ge­führt. Öffnen Sie Ihren be­vor­zug­ten Text­edi­tor und über­neh­men Sie folgendes PHP-Skript:

<?php
phpinfo();
?>
php

PHP-Skripte sind immer nach demselben Schema aufgebaut. Der öffnende PHP-Tag <?php si­gna­li­siert, dass eine Skript-Umgebung gestartet wird. Darauf folgt der ei­gent­li­che PHP-Code in Form von An­wei­sun­gen. Im Beispiel handelt es sich um den Aufruf der Funktion phpinfo(). Die meisten PHP-Funk­tio­nen verlangen einen oder mehrere Parameter, die zwischen den runden Klammern stehen; bei phpinfo() sind diese optional. Jede Anweisung endet mit einem Semikolon (;). Um die Skript-Umgebung zu schließen, kommt der schlie­ßen­de PHP-Tag zum Einsatz: ?>. Dieser ist bei reinen PHP-Dateien optional.

Speichern Sie die Textdatei unter dem Namen „test“ im Format .php (PHP-Skript) ab und starten Sie Ihren Webserver. Sofern Sie die Test­um­ge­bung XAMPP nutzen, legen Sie „test.php“ im XAMPP-Ver­zeich­nis unter „htdocs“ ab (C:\xampp\htdocs).

Bild: Die Datei test.php im htdocs-Ordner
Damit Sie die Datei test.php via XAMPP ausführen können, müssen Sie diese im htdocs-Ordner plat­zie­ren.

Die Bei­spiel­da­tei lässt sich nun über folgende URL im Web­brow­ser aufrufen: http://localhost/test.php. Verwenden Sie einen anderen Webserver oder eine in­di­vi­du­el­le Kon­fi­gu­ra­ti­on der XAMPP-Software, wählen Sie die URL dem je­wei­li­gen Dateipfad ent­spre­chend.

Mit dem Eintippen der URL http://localhost/test.php weisen Sie Ihren Web­brow­ser an, die Datei „test.php“ vom Webserver an­zu­for­dern. Der Apache HTTP Server oder die von Ihnen be­vor­zug­te Webserver-Software ruft die Datei im ent­spre­chen­den Ver­zeich­nis ab. Die Endung .php kündigt an, dass die Datei PHP-Code enthält. Nun schaltet sich der in den Webserver ein­ge­bun­de­ne PHP-In­ter­pre­ter ein. Dieser parst das Dokument und stößt auf das öffnende PHP-Tag <?php. Der In­ter­pre­ter ist in der Lage, den PHP-Code aus­zu­füh­ren und eine HTML-Ausgabe zu erzeugen, die vom Webserver an den Web­brow­ser aus­ge­lie­fert wird.

Hinweis

Bei der Funktion phpinfo() handelt es sich um die Kurz­schreib­wei­se des Stan­dard­werts phpinfo(INFO_ALL). Dieser gibt de­tail­lier­te In­for­ma­tio­nen zur PHP-Kon­fi­gu­ra­ti­on Ihres Web­ser­vers aus. Ist keine PHP-Version auf­find­bar, zeigt der Web­brow­ser eine Feh­ler­mel­dung oder liefert den PHP-Code, ohne diesen zu in­ter­pre­tie­ren, an den Browser aus.

„Hello World!“ – so geben Sie Text per echo aus

Wurde PHP feh­ler­frei in­stal­liert, wird es Zeit, das erste eigene Skript zu schreiben. Dazu bietet sich die Anweisung PHP echo an. Anders als phpinfo() stellt echo keine Funktion dar. Vielmehr handelt es sich um ein Sprach­kon­strukt, das es er­mög­licht, einen nach­fol­gen­den String als Text aus­zu­ge­ben.

De­fi­ni­ti­on

Sprach­kon­struk­te sind An­wei­sun­gen, die in PHP dazu genutzt werden, den Pro­gramm­ab­lauf zu steuern. Zu den Sprach­kon­struk­ten zählen neben echo An­wei­sun­gen wie if, for, do, include, return, exit oder die. Daher sind in diesem Fall anders als bei Funk­tio­nen keine Klammern nötig.

Erstellen Sie für Ihr erstes eigenes Skript eine neue PHP-Datei und notieren Sie in dieser folgenden Code:

<?php
echo 'Hello World!';
php

Das öffnende Tag <?php startet eine Skript-Umgebung. Es folgt das Sprach­kon­strukt echo sowie der in einfache An­füh­rungs­zei­chen gefasste String „Hello World!“. Achten Sie auf das Semikolon nach der Anweisung. Statt „Hello World!“ kann ein be­lie­bi­ger Text verwendet werden. Da es sich um eine reine PHP-Datei handelt, haben wir auf den schlie­ßen­den PHP-Tag ver­zich­tet.

Tipp

Der schlie­ßen­de PHP-Tag ?> muss bei reinen PHP-Dateien nicht verwendet werden. So lassen sich ver­se­hent­li­che Leer­zei­len oder un­sicht­ba­re Zeichen am Dateiende vermeiden, die zu Feh­ler­mel­dun­gen wie „Headers already sent“ führen können.

Speichern Sie das Skript unter „hello.php“ im Ordner „htdocs“ auf ihrem Webserver ab und rufen Sie die Datei über die URL ‘http://localhost/hello.php’ im Web­brow­ser auf. Wurde der Code richtig über­tra­gen, sollte das Brow­ser­fens­ter nun die von Ihnen ver­wen­de­te Zei­chen­fol­ge zeigen:

Bild: Textausgabe mit Sprachkonstrukt echo
Im Browser sehen Sie nun die Ausgabe „Hello World.“

Jeder Text, den Sie mit echo ausgeben, kann bei Bedarf mit HTML-Tags aus­ge­zeich­net werden. Diese werden vom Web­brow­ser an­schlie­ßend der HTML-Spe­zi­fi­ka­ti­on ent­spre­chend in­ter­pre­tiert. Versuchen Sie es selbst, z. B. mit folgendem Skript:

<?php
echo '<h1>Hello World!</h1>
<p>This is my first PHP page.</p>';
php

Im Web­brow­ser auf­ge­ru­fen wird das Ergebnis der Skript­aus­füh­rung fol­gen­der­ma­ßen dar­ge­stellt:

Bild: Ergebnis einer Skriptausführung mit HTML-Tags
Die Ausgabe kann im PHP-Skript mit HTML-Tags for­ma­tiert werden.

Die in <h1>-Tags gefasste Zei­chen­fol­ge „Hello World!“ wird vom Web­brow­ser als Über­schrift erster Ordnung in­ter­pre­tiert. Es folgen ein au­to­ma­ti­scher Zei­len­um­bruch und der Text­ab­satz <p>.

Je nach Bedarf lässt sich echo sowohl mit einfachen (') als auch mit doppelten An­füh­rungs­zei­chen (") einsetzen. Möchten Sie lediglich Text ausgeben, macht es keinen Un­ter­schied, für welche An­füh­rungs­zei­chen Sie sich ent­schei­den. Dies ändert sich jedoch, sobald PHP-Variablen ins Spiel kommen.

Variablen

Das Sprach­kon­strukt echo hält mehr bereit als die reine Text­aus­ga­be. Diese lässt sich schließ­lich auch ohne PHP auf Basis von HTML her­vor­ra­gend umsetzen. Der ei­gent­li­che Mehrwert von echo beruht darauf, dass die Anweisung es er­mög­licht, Texte mithilfe von Variablen dynamisch zu erzeugen.

Variablen begegnen Ihnen z. B. in folgender Form: $beispiel.

Jede Variable besteht aus einem Dol­lar­zei­chen ($) gefolgt vom Variablen-Namen. Variablen kommen in PHP-Skripten zum Einsatz, um externe Daten in Webseiten ein­zu­bin­den. Dabei kann es sich um Werte ver­schie­de­ner Art handeln – von einfachen Zahlen und Zei­chen­ket­ten bis hin zu ganzen Texten oder HTML-Do­ku­ment­struk­tu­ren.

PHP un­ter­schei­det acht Variablen-Typen:

Variablen-Typ Be­schrei­bung
String Ein String ist eine Zei­chen­ket­te. Dabei kann es sich um ein Wort, einen Satz, einen Text oder den gesamten HTML-Code einer Webseite handeln.
Integer Ein Integer ist eine Ganzzahl ohne Nach­kom­ma­stel­len. Diese kann positiv oder negativ sein.
Float Ein Float ist eine Fließ­kom­ma­zahl, sprich ein Zah­len­wert mit Nach­kom­ma­stel­len. Das Komma wird bei Pro­gram­mier­spra­chen als Punkt (.) notiert. PHP un­ter­stützt bis zu 14 Stellen hinter dem Komma
Boolean Boolesche Variablen sind das Ergebnis einer logischen Operation und kennen nur zwei Werte: TRUE (wahr) und FALSE (falsch). Dieser Va­ria­blen­typ kommt etwa zum Einsatz, wenn Sie mit Be­din­gun­gen arbeiten.
Array Ein Array ist eine Variable, die mehrere Elemente be­inhal­ten kann. Es handelt sich somit um eine Grup­pie­rung mehrerer gleich­ar­tig struk­tu­rier­ter Daten, die zu einem Array zu­sam­men­ge­fasst wurden.
Object Der Variablen-Typ object er­mög­licht es Pro­gram­mie­rern, eigene Da­ten­ty­pen zu de­fi­nie­ren. Anwendung findet er bei der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung. In unserem PHP-Tutorial für An­fän­ge­rin­nen und Anfänger klammern wir object-Variablen aus.
NULL Der Wert NULL re­prä­sen­tiert eine Variable ohne Wert. Für Variablen des Typs NULL ist dies der einzig mögliche Wert.
Resource Eine Resource ist eine spezielle Variable, die eine Referenz auf externe Res­sour­cen enthält, z. B. eine geöffnete Datei, eine Da­ten­bank­ver­bin­dung oder einen Socket. Res­sour­cen werden von PHP selbst verwaltet. In unserem PHP-Tutorial für An­fän­ge­rin­nen und Anfänger klammern wir resource-Variablen aus.

Die zentrale Ver­wal­tung von Inhalten erfolgt in der Regel mithilfe von Da­ten­bank­sys­te­men. Werte für Variablen lassen sich jedoch auch direkt im Skript de­fi­nie­ren. Diese Art der Zuordnung erfolgt nach folgendem Schema:

$beispiel = "Wert";
php

Auf das cha­rak­te­ris­ti­sche Dol­lar­zei­chen folgt der Variablen-Name (in diesem Fall beispiel). Dieser wird durch das Gleich­heits­zei­chen (=) mit einem in doppelte An­füh­rungs­zei­chen gefassten Wert verknüpft. Werte für Variablen des Typs Integer und Float werden ohne An­füh­rungs­zei­chen notiert (z. B. $beispiel = 24; bzw. $beispiel = 2.7;)

PHP bietet Ihnen die Freiheit, Variablen nach eigenem Ermessen zu benennen. Es gelten jedoch folgende Ein­schrän­kun­gen:

  • Jede Variable beginnt mit einem Dol­lar­zei­chen.
  • Ein Variablen-Name ist eine beliebige Zei­chen­fol­ge aus Buch­sta­ben, Ziffern und Un­ter­stri­chen (z. B. $beispiel\_1).
  • Ein gültiger Variablen-Name beginnt immer mit einem Buch­sta­ben oder einem Un­ter­strich ($beispiel1 oder $\_beispiel), nie mit einer Ziffer (falsch: $1beispiel).
  • PHP ist case-sensitive. Die Skript­spra­che un­ter­schei­det zwischen Groß- und Klein­schrei­bung ($beispiel$Beispiel).
  • Der Variablen-Name darf keine Leer­zei­chen oder Zei­len­um­brü­che enthalten (falsch: $beispiel 1)
  • Von PHP für andere Zwecke re­ser­vier­te Zei­chen­fol­gen können nicht als be­nut­zer­de­fi­nier­te Variablen ein­ge­setzt werden (z. B. $this)

Wir schauen uns das an einem Beispiel an:

<?php
$author = "John Doe";
echo "<h1>Hello World!</h1>
<p>This dynamic web page was created by $author.</p>";
php

Auf das öffnende PHP-Tag folgt die De­fi­ni­ti­on der Variable: Für $author soll der Wert „John Doe“ verwendet werden. Bei der Skript­aus­füh­rung wird die Variable $author somit bei jeder Nennung innerhalb der Skript-Umgebung durch den Wert „John Doe“ ersetzt. Wie das im Web­brow­ser aussieht, zeigt die nach­ste­hen­de Grafik.

Bild: Dynamische Texterstellung mit Variablen
Variablen fungieren als eine Art Platz­hal­ter und er­mög­li­chen dy­na­mi­sche Tex­terstel­lung.

Liegt nun ein Irrtum vor und die Webpage stammt gar nicht von John Doe, sondern von seinem deutschen Kollegen Max Mus­ter­mann, braucht lediglich die Variable mit dem Namen $author angepasst zu werden, um den Fehler zu beheben. Effizient ist dies vor allem dann, wenn eine Variable innerhalb eines Skripts mehrfach vorkommt. Eine Korrektur müsste in diesem Fall lediglich an einer einzigen Stelle vor­ge­nom­men werden. Nämlich da, wo der Wert der Variable definiert wird.

Die Vorteile dieses De­sign­kon­zepts liegen auf der Hand: Werden Elemente der Website (z. B. im Footer-Bereich) über­ar­bei­tet, müssen die An­pas­sun­gen nicht auf jeder einzelnen Un­ter­sei­te des Web­pro­jekts manuell vor­ge­nom­men werden. Statt­des­sen genügt es, den ent­spre­chen­den Eintrag in der Datenbank zu ak­tua­li­sie­ren. So wird die Über­ar­bei­tung au­to­ma­tisch für alle Webpages über­nom­men, die die ent­spre­chen­den Daten als Variablen einbinden.

Wird eine Variable innerhalb eines Skripts mehrfach definiert, über­schreibt die neue De­fi­ni­ti­on die vor­her­ge­hen­de. Ein nach­fol­gen­des echo gibt immer den aktuellen Wert einer Variable aus.

<?php
$author = "John Doe";
echo "<h1>Hello World!</h1>
<p>This dynamic web page was created by $author.</p>";
$author = "Max Mustermann";
echo " <p>Supported by $author.</p>";
php

Im Code­bei­spiel wird für die Variable $author erst der Wert „John Doe“ vergeben und an­schlie­ßend durch den Wert „Max Mus­ter­mann“ ersetzt.

Bild: Das Überschreiben von Variablen
Wird eine gleich­na­mi­ge Variable mehrfach definiert, über­schreibt die jeweils letzte De­fi­ni­ti­on die vorherige.

Nun zum Thema An­füh­rungs­zei­chen. Anders als Strings brauchen einzelne Variablen nicht in An­füh­rungs­zei­chen gesetzt werden:

<?php
$author = "John Doe";
echo $author;
php

Es sei denn, die Variable soll innerhalb eines Strings verwendet werden. In diesem Fall arbeiten Sie mit doppelten An­füh­rungs­zei­chen (). Diese si­gna­li­sie­ren dem PHP-In­ter­pre­ter, dass er den String nach Variablen absuchen soll, die ggf. durch die mit ihnen ver­knüpf­ten Werte zu ersetzen sind. Zei­chen­fol­gen, die in einfache An­füh­rungs­zei­chen () gefasst sind, werden als reine Text­in­for­ma­ti­on in­ter­pre­tiert und wie­der­ge­ge­ben – selbst dann, wenn es sich um Variablen handelt.

<?php
$author = "John Doe";
echo '<h1>Hello World!</h1>
<p>This dynamic web page was created by $author.</p>';
php

Die Variable wird in diesem Fall also nicht in­ter­pre­tiert, sondern einfach als Text wie­der­ge­ge­ben.

Bild: Reine Textausgabe bei einfachen Anführungszeichen
Wenn ein String in einfachen An­füh­rungs­zei­chen steht und dort eine Va­ria­blen­nen­nung auftaucht, wird diese nicht in­ter­pre­tiert.
Hinweis

Sie fragen sich nun viel­leicht, was passiert, wenn Sie die An­füh­rungs­zei­chen ganz weglassen? In diesem Fall weist PHP sie auf einen syn­tak­ti­schen Fehler hin.

Strikte Ty­pi­sie­rung mit declare(strict_types=1)

Stan­dard­mä­ßig versucht PHP, un­ter­schied­li­che Da­ten­ty­pen au­to­ma­tisch in­ein­an­der um­zu­wan­deln. Dieses Verhalten wird häufig als Typ-Jon­glie­ren be­zeich­net und kann dazu führen, dass feh­ler­haf­te Werte unbemerkt wei­ter­ver­ar­bei­tet werden. Mit der Direktive declare(strict_types=1); lässt sich dieses Verhalten gezielt de­ak­ti­vie­ren. PHP prüft dann bei Funk­ti­ons­auf­ru­fen strikt, ob über­ge­be­ne Argumente und Rück­ga­be­wer­te den de­kla­rier­ten Va­ria­blen­ty­pen ent­spre­chen. Die Direktive muss am Anfang einer PHP-Datei stehen und wirkt nur auf diese Datei:

<?php
declare(strict_types=1);
function addiere(int $a, int $b): int
{
return $a + $b;
}
echo addiere(2, 3); 
echo addiere("2", 3);
php

Im Beispiel ak­zep­tiert eine PHP-Funktion namens addiere() aus­schließ­lich Integer-Werte. Während der Aufruf mit 2 und 3 pro­blem­los funk­tio­niert, führt der zweite Aufruf zu einem Fehler, da der String "2" nicht au­to­ma­tisch in eine Ganzzahl um­ge­wan­delt wird. Durch die strikte Ty­pi­sie­rung werden solche Probleme früh­zei­tig erkannt, was die Wart­bar­keit und Zu­ver­läs­sig­keit von PHP-Code deutlich ver­bes­sert.

Feh­ler­mel­dun­gen und Mas­kie­rung

Kommt es zu syn­tak­ti­schen Fehlern, liegt kein valider PHP-Code vor und die geladene Seite im Browser ist leer oder der PHP-In­ter­pre­ter gibt eine Feh­ler­mel­dung aus. Zu erwarten ist eine solche bei­spiels­wei­se, wenn man die Anweisung echo mit einem String ohne An­füh­rungs­zei­chen einsetzt:

<?php
echo Hello World!;
php

Feh­ler­mel­dun­gen be­inhal­ten in den meisten Fällen Angaben dazu, wo ein Fehler auf­ge­tre­ten ist, und liefern so wichtigen Input zu dessen Be­sei­ti­gung. Sie können die Meldungen in jedem Fall im XAMPP-Log unter „C:\xampp\logs\php_error_log“ einsehen.

Bild: Im Log finden Sie eine Fehlermeldung: Parse error
Fehler werden jederzeit im XAMPP-Log angezeigt.

Im aktuellen Beispiel wird ein Fehler in Zeile 2 unseres Pro­gramm­codes vermutet – genau da, wo wir zu De­mons­tra­ti­ons­zwe­cken die An­füh­rungs­zei­chen weg­ge­las­sen haben.

Zu syn­tak­ti­schen Fehlern kommt es auch, wenn Sie Zeichen als Text ausgeben möchten, die in PHP mit einer be­stimm­ten Aufgabe verbunden sind. Ein Beispiel wäre das An­füh­rungs­zei­chen (). Zeichen wie diese lassen sich in PHP nur dann als Text ausgeben, wenn Sie dem In­ter­pre­ter ver­ständ­lich machen, dass das Zeichen seiner ei­gent­li­chen Aufgabe entbunden wurde. Im Fall von einfachen An­füh­rungs­zei­chen stehen Ihnen dazu zwei Mög­lich­kei­ten zu Verfügung: Sie können einen String mit einfachen An­füh­rungs­zei­chen in doppelte An­füh­rungs­zei­chen fassen oder die An­füh­rungs­zei­chen durch einen vor­an­ge­stell­ten Backslash maskieren (auch „escapen“ genannt):

<?php
echo '\'Hello World!\' ';
php
Bild: Der Backslash als Maskierungszeichen
Der Backslash dient in PHP als Mas­kie­rungs­zei­chen.

Ebenfalls möglich wäre die Kom­bi­na­ti­on einfacher und doppelter An­füh­rungs­zei­chen:

<?php
echo " 'Hello World!' ";
php

Nicht jedoch diese Schreib­wei­se:

<?php
echo ' 'Hello World!' ';
php

Die Leer­zei­chen zwischen den An­füh­rungs­zei­chen wurden in den Bei­spie­len zwecks Les­bar­keit eingefügt.

Ver­ket­tungs­ope­ra­to­ren

Möchten Sie mehrere Variablen innerhalb eines PHP-Skripts gleich­zei­tig ausgeben, könnten Sie dies so umsetzen, wie bisher gelernt:

<?php
$author1 = "John Doe";
$author2 = "Max Mustermann";
echo "<h1>Hello World!</h1>
<p>This dynamic web page was created by $author1 and $author2.</p>";
php

Sie schreiben beide Variablen einfach zusammen mit dem rest­li­chen Text, der aus­ge­ge­ben werden soll, in den in doppelte An­füh­rungs­zei­chen gefassten String. PHP erkennt die Variablen anhand des Dol­lar­zei­chens ($) au­to­ma­tisch und setzt die ent­spre­chen­den Werte ein.

Bild: Textausgaben mit zwei Variablen
Mit zwei Variablen können Sie theo­re­tisch genau verfahren wie mit einer einzigen.

Unter Pro­gram­mie­re­rin­nen und Pro­gram­mie­rern gilt ein solches Vorgehen jedoch als unsaubere Arbeit. Es gilt das Dogma, dass Variablen nicht Teil des Strings sein sollten. Ein Grund dafür ist, dass zahl­rei­che Pro­gram­mier­spra­chen eine solche Trennung vor­schrei­ben. Wichtiger ist, dass auch PHP die Trennung von String und Variable empfiehlt, wenn wir mit Funk­ti­ons­auf­ru­fen oder kom­ple­xe­ren Variablen arbeiten. Es lohnt sich daher, diese Trennung auch bei der reinen Text­aus­ga­be kon­se­quent um­zu­set­zen, selbst wenn es in diesem Fall nicht zwangs­läu­fig nötig wäre.

Arbeiten wir mit Variablen, haben wir es somit immer mit mehreren Elementen zu tun, die bei der Ausgabe mit­ein­an­der verkettet werden müssen. In PHP kommt dazu der Ver­ket­tungs­ope­ra­tor (.) zum Einsatz.

„Sauber“ pro­gram­miert müsste der Code für das oben an­ge­führ­te Beispiel somit fol­gen­der­ma­ßen aussehen:

<?php
$author1 = "John Doe";
$author2 = "Max Mustermann";
echo '<h1>Hello World!</h1>
<p>This dynamic web page was created by ' . $author1 . ' and ' . $author2 . '.</p>';
php

Wir haben es somit mit drei Strings und zwei Variablen zu tun, die zu einer Zei­chen­fol­ge verkettet werden.

String1 Variable1 String2 Variable2 String3
‘<h1>Hello World!</h1><p>This dynamic web page was created by’ . $author1 . ’ and ’ . $author2 . ‘<\p>’

Zu beachten ist, dass ein Ver­ket­tungs­ope­ra­tor Strings oder Variablen ohne Leer­zei­chen zu­sam­men­fügt. Wird ein Leer­zei­chen gewünscht, muss dieses wie im Beispiel im String innerhalb der An­füh­rungs­zei­chen notiert werden.

Bild: Verbindung von Strings und Variablen mit Verkettungsoperatoren
Es ist gute Pro­gram­mier­pra­xis, mehrere Elemente bei der Ausgabe mit dem Ver­ket­tungs­ope­ra­tor zu kon­ka­te­nie­ren.

Pro­gram­mie­re­rin­nen und Pro­gram­mie­rer nutzen den Ver­ket­tungs­ope­ra­tor nicht nur, um Strings und Variablen für die Text­aus­ga­be zu ver­knüp­fen, sondern auch, um Variablen zu ver­län­gern. Wie das funk­tio­niert, zeigt das folgende Beispiel:

<?php
$beispiel = 'Hallo ';
$beispiel .= 'Welt';
echo $beispiel;
php

Um den Wert einer Variable zu ver­län­gern, de­fi­nie­ren Sie diese erneut, setzen dabei aber den Ver­ket­tungs­ope­ra­tor vor das Gleich­heits­zei­chen. Es handelt sich dabei um die allgemein übliche Kurz­schreib­wei­se für $beispiel = $beispiel . 'Welt'.

PHP fügt den neuen Wert an den zuvor de­fi­nier­ten an. Wünschen Sie ein Leer­zei­chen zwischen beiden Werten, notieren Sie dieses wie im Beispiel am Ende des ersten Strings.

Bild: Verlängerung des Werts einer Variable
Der Ver­ket­tungs­ope­ra­tor wird auch ein­ge­setzt, um Variablen direkt zu kon­ka­te­nie­ren.

PHP in HTML einbinden

Der PHP-In­ter­pre­ter in­ter­es­siert sich prin­zi­pi­ell nur für Code, der sich zwischen einem öffnenden und einem schlie­ßen­den PHP-Tag befindet (wobei letzteres bei reinem PHP optional ist):

<?php [Dieser Bereich wird vom PHP-Interpreter geparst] ?>

Alle anderen Ab­schnit­te des Dokuments werden vom In­ter­pre­ter ignoriert und so, wie sie sind, an den Webserver wei­ter­ge­ge­ben. PHP-Code lässt sich somit beliebig in HTML-Dokumente in­te­grie­ren – um z. B. ein Template für ein Content-Ma­nage­ment-System zu erstellen. Dabei ist darauf zu achten, dass HTML-Dokumente, die PHP-Code enthalten, als PHP-Dateien ge­spei­chert werden. Ansonsten wird das Dokument nicht vom PHP-In­ter­pre­ter vor­ver­ar­bei­tet, sondern direkt an den Web­brow­ser aus­ge­lie­fert – was zur Folge hätte, dass der Pro­gramm­code als Text auf der Website erscheint.

Den PHP-In­ter­pre­ter können Sie sich somit als den faulen Kollegen des Web­ser­vers vor­stel­len, der nur dann arbeitet, wenn er explizit dazu auf­ge­for­dert wird – z. B. durch ein öffnendes PHP-Tag.

Möchten Sie HTML und PHP kom­bi­nie­ren, schreiben Sie Ihre HTML-Seite wie gewohnt gemäß der klas­si­schen Do­ku­ment­struk­tur und speichern diese unter der Da­tei­endung .php ab:

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>My first PHP page</title>
</head>
<body>
<h1>Hello World</h1>
<p>What is the current time and date?</p>
</body>
</html>
html

Ergänzen Sie Ihr HTML-Dokument nun um ein PHP-Skript. Achten Sie darauf, dass sich der gesamte Pro­gramm­code innerhalb der PHP-Tags befindet.

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>My first PHP page</title>
</head>
<body>
<h1>Hello World</h1>
<p>What is the current time and date?</p>
<p>Your current time and date is:
<?php
echo date("d.m.Y H:i:s");
?>.</p>
</body>
</html>
html

Im Beispiel haben wir das Sprach­kon­strukt echo mit der PHP-Funktion date() kom­bi­niert, um das aktuelle Datum inklusive Uhrzeit ser­ver­sei­tig als Text ausgeben zu lassen. Der Parameter der Funktion gibt das ge­wünsch­te Format in Form eines Strings an:

"d.m.Y H:i:s" (Tag.Monat.Jahr Stunde:Minute:Sekunde)

Wird eine solche Datei von einem Web­brow­ser an­ge­for­dert, führt der PHP-In­ter­pre­ter zunächst das Skript aus und schreibt die aktuelle Uhrzeit als Text in das HTML-Dokument. Dieses wird im Anschluss vom Webserver aus­ge­lie­fert und im Browser als Webpage dar­ge­stellt.

Bild: Integration von PHP in HTML
Sie können PHP-Funk­tio­nen in Ihren HTML-Code einbetten.

Die PHP-Kom­men­tar­funk­ti­on

Wie HTML-Code lässt sich auch PHP beliebig aus­kom­men­tie­ren. Kom­men­ta­re im Quellcode werden vom PHP-In­ter­pre­ter ignoriert, sofern diese der Syntax ent­spre­chend aus­ge­zeich­net wurden. PHP stellt dazu drei ver­schie­de­ne Al­ter­na­ti­ven bereit.

Möchten Sie eine gesamte Zeile als Kommentar aus­zeich­nen und somit von der In­ter­pre­ta­ti­on aus­schlie­ßen, nutzen Sie den Hashtag (#) oder zwei auf­ein­an­der­fol­gen­de Slashs. Im folgenden Code­bei­spiel kommen beide Mög­lich­kei­ten zum Einsatz:

<?php
## This is a single line comment
echo '<h1>Hello World!</h1>
<p>This is my first PHP page.</p>';
// This is also a single-line comment!
php

Text­edi­to­ren oder IDEs mit Syn­tax­her­vor­he­bung heben Kom­men­ta­re farblich hervor. Die in der Skript-Umgebung als Kommentar aus­ge­zeich­ne­ten Text­stel­len kommen im Web­brow­ser – im Gegensatz zu HTML-Kom­men­ta­ren – gar nicht erst an, da diese bereits bei der Skript­aus­füh­rung durch den PHP-In­ter­pre­ter ignoriert werden.

Darüber hinaus haben Sie die Mög­lich­keit, Kom­men­ta­re ein­zu­fü­gen, die sich über mehrere Zeilen er­stre­cken. Markieren Sie dazu den Anfang eines Kom­men­tar­ab­schnitts mit einem Slash gefolgt von einem Asterisk und das Ende mit einem Asterisk gefolgt von einem Slash.

<?php
/*
This is a multiple-lines comment block
that spans over multiple
lines
*/
echo '<h1>Hello World!</h1>
<p>This is my first PHP page.</p>';
php

Auch derart aus­ge­zeich­ne­te Kom­men­ta­re werden nicht geparst und er­schei­nen somit nicht auf der Webseite.

Bild: Beispiel eines mehrzeiligen Kommentars
Wie Sie sehen können, werden Kom­men­ta­re nicht aus­ge­ge­ben.

Pro­gram­mie­re­rin­nen und Pro­gram­mie­rer nutzen Kom­men­ta­re, um den Quellcode ihrer Skripte zu struk­tu­rie­ren, Hinweise für eine spätere Be­ar­bei­tung zu hin­ter­las­sen oder der Er­stel­lung interne Angaben wie den Autor oder das Datum hin­zu­zu­fü­gen. Kom­men­ta­re sind optional und sollten sparsam verwendet werden, um eine gute Les­bar­keit des Quell­codes zu ge­währ­leis­ten.

Rechnen mit Variablen

Im Rahmen unseres PHP-Tutorials sind Sie bereits mit Variablen in Berührung gekommen. Dabei wurden diesen in erster Linie String-Werte (sprich: Zei­chen­fol­gen) zu­ge­wie­sen. Nun werden wir uns mit Variablen be­schäf­ti­gen, die Ganz­zah­len (Integers) oder Gleit­kom­ma­zah­len (Floats) re­prä­sen­tie­ren.

Speichern Variablen Zah­len­wer­te, bietet PHP die Mög­lich­keit, mit diesen Be­rech­nun­gen durch­zu­füh­ren. Wir beginnen mit einer einfachen Addition zweier Ganz­zah­len:

<?php
$zahl1 = 237;
$zahl2 = 148;
$ergebnis = $zahl1 + $zahl2;
echo "Ergebnis: " . $ergebnis;
php

Zunächst weisen wir den Variablen $zahl1 und $zahl2 die Ganz­zah­len 237 und 148 zu und de­fi­nie­ren im Anschluss eine Variable $ergebnis. Diese soll die Summe der beiden Variablen speichern. Dazu bedienen wir uns des **arith­me­ti­schen Operators + (Plus). Ab­schlie­ßend geben wir das Ad­di­ti­ons­er­geb­nis mithilfe des Sprach­kon­strukts echo als Text aus. Beachten Sie, dass Sie bei der Zuweisung von Zah­len­wer­ten zu Variablen keine An­füh­rungs­zei­chen benötigen.

Bild: Addition von Ganzzahlen mithilfe eines PHP-Skripts
Sie können mit nu­me­ri­schen Variablen genau wie mit Zahlen rechnen.

Folgendes Code­bei­spiel zeigt eine Auswahl ma­the­ma­ti­scher Be­rech­nun­gen, die sich mit PHP ser­ver­sei­tig durch­füh­ren lassen. Die ver­wen­de­ten PHP-Ope­ra­to­ren ent­spre­chen größ­ten­teils den stan­dar­di­sier­ten Re­chen­zei­chen der Ma­the­ma­tik.

Arith­me­ti­scher Operator Operation Ergebnis
$zahl1 + $zahl2 Addition Summe von $zahl1 und $zahl2
$zahl1 - $zahl2 Sub­trak­ti­on Differenz von $zahl1 und $zahl2
$zahl1 * $zahl2 Mul­ti­pli­ka­ti­on Produkt von $zahl1 und $zahl2
$zahl1 / $zahl2 Division Quotient von $zahl1 und $zahl2
$zahl1 ** $zahl2 Potenz $zahl2-te Potenz von $zahl1
<?php
$zahl1 = 10;
$zahl2 = 5;
$addition = $zahl1 + $zahl2; //Addition
$subtraktion = $zahl1 - $zahl2; //Subtraktion
$multiplikation = $zahl1 * $zahl2; //Multiplikation
$division = $zahl1 / $zahl2; //Division
$potenz = $zahl1 ** $zahl2; //Potenzrechnung
echo "Ergebnis der Addition: " . $addition ."<br />";
echo "Ergebnis der Subtraktion: " . $subtraktion . "<br />";
echo "Ergebnis der Multiplikation: " . $multiplikation . "<br />";
echo "Ergebnis der Division: " . $division . "<br />";
echo "5-te Potenz von 10 (10^5): " . $potenz . "<br />";
echo "Wurzel von 81: " . sqrt(81) . "<br />";
php

Die Ausgabe sieht wie folgt aus:

Bild: Rechnen mit Variablen
Sie können die gängigen Re­chen­ope­ra­tio­nen in PHP auch mit nu­me­ri­schen Variablen durch­füh­ren.

Für komplexe Be­rech­nun­gen lassen sich die ver­schie­de­nen arith­me­ti­schen Ope­ra­tio­nen in einem Skript kom­bi­nie­ren:

<?php
$zahl1 = 10;
$zahl2 = 5;
$ergebnis = 2 *$zahl1 + 5* $zahl2 - 3 * sqrt(81);
echo "Ergebnis: " . $ergebnis;
php

Der PHP-In­ter­pre­ter ermittelt die Werte der Variablen und berechnet:

2 *10 + 5* 5 - 3 * √81 = 20 + 25 – 27 = 18

Die Funktion sqrt() berechnet die Qua­drat­wur­zel des ein­ge­klam­mer­ten Pa­ra­me­ters. Es gilt die klas­si­sche Operator-Rangfolge der Ma­the­ma­tik: Punkt- vor Strich­rech­nung. Die Anweisung echo gibt das Ergebnis als String für den Web­brow­ser aus.

Ein­ge­klam­mer­te Terme werden auch in PHP zuerst aus­ge­wer­tet. Wir arbeiten diesmal mit Fließ­kom­ma­zah­len:

<?php
$zahl1 = 2.5;
$zahl2 = 3.7;
$ergebnis = 2 *($zahl1 + 5)* ($zahl2 - 3) * sqrt(81);
echo "Ergebnis: " . $ergebnis;
php
Bild: Berechnung mit Fließkommazahlen und eingeklammerten Termen
Die Be­rech­nun­gen funk­tio­nie­ren ebenfalls mit Fließ­kom­ma­zah­len.

Wie die meisten gängigen Pro­gram­mier­spra­chen un­ter­stützt auch PHP Ope­ra­to­ren, um Zah­len­wer­te um den Wert 1 zu erhöhen oder zu ver­min­dern. Man un­ter­schei­det zwischen dem Prä-In­kre­men­t­ope­ra­tor, dem Prä-De­kre­men­t­ope­ra­tor, dem Post-In­kre­men­t­ope­ra­tor und Post-De­kre­men­t­ope­ra­tor.

Operation Operator Ergebnis
Prä-Inkrement ++$zahl Der Operator ++ in­kre­men­tiert den Wert der Variable $zahl. Dabei wird der Wert um 1 erhöht. Das Ergebnis wird als neuer Wert von $zahl zu­rück­ge­ge­ben.
Prä-Dekrement --$zahl Der Operator -- de­kre­men­tiert den Wert der Variable $zahl. Dabei wird der Wert um 1 ver­min­dert. Das Ergebnis wird als neuer Wert von $zahl zu­rück­ge­ge­ben.
Post-Inkrement $zahl++ Der aktuelle Wert von $zahl wird zunächst zu­rück­ge­ge­ben und an­schlie­ßend um den Wert 1 erhöht.
Post-Dekrement $zahl-- Der aktuelle Wert von $zahl wird zunächst zu­rück­ge­ge­ben und an­schlie­ßend um den Wert 1 ver­min­dert.

Wir de­mons­trie­ren die Re­chen­ope­ra­tio­nen mit Inkrement- bzw. De­kre­men­t­ope­ra­to­ren am Beispiel der Prä-In­kre­men­tie­rung. Folgendes Skript erhöht den Wert der Variable $zahl um 1, speichert den neuen Wert in der Variable $ergebnis und gibt deren Wert an­schlie­ßend als String aus:

<?php
$zahl = 0;
$ergebnis = ++$zahl;
echo "Ergebnis: " . $ergebnis;
php

Erhöht man den Wert 0 um 1, erhält man das Ergebnis 1.

Bild: Prä-Inkrementierung der Zahl 0
Die Prä-In­kre­men­tie­rung erhöht den Wert der Variable, bevor sie aus­ge­ge­ben wird, um eins.

Um das Prä-Dekrement der Variable $zahl zu berechnen, bedienen wir uns derselben Skripts, tauschen jedoch den Prä-In­kre­men­t­ope­ra­tor (++) gegen den Prä-De­kre­men­t­ope­ra­tor (--):

<?php
$zahl = 0;
$ergebnis = --$zahl;
echo "Ergebnis: " . $ergebnis;
php

Wir de­kre­men­tie­ren somit den Wert 0 der Variable $zahl und erhalten das Ergebnis -1.

Eine Erhöhung vor und nach der Ausgabe (Prä- vs. Post-…) eines Wertes lässt sich an folgendem Skript ver­deut­li­chen:

<?php
$x = 0;
echo '<p>Ergebnis: ' . ++$x;
echo '<br>x hat den Wert ' . $x;
echo '<p>Ergebnis: ' . $x++;
echo '<br>x hat den Wert ' . $x, '</p>';
php

In beiden Fällen erhalten wir dasselbe Ergebnis. Bei der Prä-In­kre­men­tie­rung wird der Wert x vor der Ausgabe in Zeile 3 erhöht und bei der Post-In­kre­men­tie­rung nach der Ausgabe in Zeile 5.

Bild: Der Unterschied zwischen Prä- und Post-Inkrementierungen
Bei der Prä-In­kre­men­tie­rung wird der Wert der Variable vor der Ausgabe erhöht; bei der Post-In­kre­men­tie­rung danach.

Skalare Typen und Union Types

PHP er­mög­licht es, Variablen, Funk­ti­ons­pa­ra­me­ter und Rück­ga­be­wer­te mit so­ge­nann­ten skalaren Typen zu versehen. Zu diesen zählen unter anderem int, float, string und bool. Durch die explizite Typangabe wird fest­ge­legt, welche Art von Werten eine Funktion erwartet und zu­rück­lie­fert. Dies erhöht die Les­bar­keit des Codes und hilft dabei, typische Fehler früh­zei­tig zu erkennen.

function hi(string $name): string {
return "Hallo " . $name;
}
php

In diesem Beispiel erwartet die selbst­ge­schrie­be­ne Funktion hi() einen String als Parameter und gibt ebenfalls einen String zurück. Wird ein anderer Datentyp übergeben, meldet PHP einen Fehler. In manchen Si­tua­tio­nen soll eine Funktion jedoch mehr als einen Datentyp ak­zep­tie­ren. Dafür stellt PHP so­ge­nann­te Union Types zur Verfügung. Diese erlauben es, mehrere mögliche Typen zu de­fi­nie­ren, getrennt durch das Pipe-Zeichen |:

function formatId(int|string $id): string {
return "ID: " . $id;
}
php

Die Funktion formatId() ak­zep­tiert hier sowohl Ganz­zah­len als auch Zei­chen­ket­ten als Parameter. Andere Da­ten­ty­pen sind nicht erlaubt. Union Types er­mög­li­chen damit flexible, aber dennoch kon­trol­lier­te Funk­ti­ons­si­gna­tu­ren.

Die Su­per­glo­bals $_GET und $_POST

Sie kennen jetzt die PHP-Grund­la­gen, wissen mit Variablen umzugehen, können diese verketten und Be­rech­nun­gen anstellen. Nun zeigen wir Ihnen, warum Variablen ein zentrales Konzept beim Pro­gram­mie­ren von Skripten sind.

Eine wichtige Funktion von Skript­spra­chen ist die Mög­lich­keit, Be­nut­zer­ein­ga­ben aus­zu­wer­ten und die Werte in ein anderes Skript zu über­tra­gen. PHP stützt sich bei der Da­ten­über­ga­be auf die Su­per­glo­bals $_GET und $\_POST – vor­de­fi­nier­te System-Variablen, die in allen Gül­tig­keits­be­rei­chen verfügbar sind. Als as­so­zia­ti­ve Arrays (Da­ten­fel­der) speichern $_GET und $_POST einen Satz von Variablen in Form von Strings in einer Variable.

PHP-Arrays können Sie sich wie einen Schrank mit mehreren Schub­la­den vor­stel­len. Jede dieser Schub­la­den bietet Ihnen die Mög­lich­keit, Daten abzulegen. Damit Sie später noch wissen, was in welcher Schublade steckt, be­schrif­ten Sie diese mit einem Variablen-Namen. Je nach Art des Arrays kann es sich dabei um einen Index oder einen Key (Schlüssel) handeln. Während Sie bei in­di­zier­ten Arrays für jede Schublade einen Index in Form einer Zahl vergeben, be­schrif­ten Sie die Schub­la­den eines as­so­zia­ti­ven Arrays mit einem Key in Form eines Strings (Zei­chen­fol­ge).

Die Su­per­glo­bals $_GET und $_POST be­inhal­ten eine Reihe von Variablen in Form von Schlüs­seln, die es er­mög­li­chen, an die mit diesen Schlüs­seln ver­bun­de­nen Werte zu gelangen. Wir kommen darauf zurück, wenn wir uns die Su­per­glo­bals $_GET und $_POST im Detail anschauen.

Da­ten­über­ga­be via $_GET

Die Su­per­glo­bal $_GET stellt ein Array von Variablen dar, die einem PHP-Skript mithilfe einer URL übergeben werden.

Falls Sie sich hin und wieder auf Weblogs oder in On­line­shops und In­ter­net­fo­ren aufhalten, werden Ihnen mög­li­cher­wei­se die ei­gen­ar­ti­gen URLs auf­ge­fal­len sein, die man dort antrifft. Üblich ist ein Aufbau nach folgendem Schema:

http://hostname/ordner/dateiname.php?variablenname=variablenwert

Auf ein Weblog über­tra­gen könnte dieses Schema so aussehen:

http://www.beispiel-blog.de/index.php?id=1

Eine solche URL lässt sich ganz einfach auf­schlüs­seln: Auf einem Webserver mit der Domain „beispiel-blog.de“ findet sich eine Datei namens „index.php“, die der Er­stel­lung einer dy­na­mi­schen Webseite dient. Diese enthält in der Regel HTML- und PHP-Code sowie Verweise auf aus­ge­la­ger­te Template-Files und externe Style­sheets – kurz alles, was benötigt wird, um eine Webseite dar­zu­stel­len.

Dass es sich wahr­schein­lich um eine dy­na­mi­sche Webseite handelt, si­gna­li­siert der Zusatz nach dem Fra­ge­zei­chen (?): id=1. Dieser wird als HTTP-Query-String be­zeich­net und be­inhal­tet eine Variable (id) und einen Wert (1), die mit einem Gleich­heits­zei­chen (=) verbunden sind. URL-Parameter dieser Art werden bei­spiels­wei­se ein­ge­setzt, um eine dy­na­mi­sche Webpage zu erzeugen, Inhalte aus einer Datenbank zu laden oder ein passendes Template auf­zu­ru­fen.

Dy­na­mi­sche Webseiten er­mög­li­chen eine Trennung von Inhalt und Prä­sen­ta­ti­on. Die „index.php“ be­inhal­tet zwar alle In­for­ma­tio­nen über die Struktur der Website, muss jedoch noch mit Inhalten befüllt werden. Diese sind in der Regel in einer Datenbank hin­ter­legt und lassen sich über die Parameter im HTTP-Query-String abrufen. In unserem Beispiel übergibt die URL der „index.php“ den Parameter: id=1. Dieser legt fest, welche Inhalte aus der Datenbank aus­ge­le­sen und in die „index.php“ geladen werden sollen. Bei einem Weblog handelt es sich meist um die ID eines be­stimm­ten Artikels. In einem Forum ließe sich so ein be­stimm­ter Eintrag abrufen und in einem On­line­shop ein be­stimm­tes Produkt.

Be­inhal­tet eine URL mehr als einen Parameter, werden diese mit einem Et-Zeichen (&) verbunden.

www.beispiel-blog.de/index.php?page=article&id=1

Um den Einsatz von $_GET an einem Code­bei­spiel zu ver­an­schau­li­chen, kommen wir auch ohne Datenbank aus. In folgendem Skript verwenden wir die Su­per­glo­bal $_GET, um die Werte der Variablen vorname und nachname aus einem HTTP-Query-String aus­zu­le­sen und in die PHP-Variablen $variable1 und $variable2 zu schreiben:

<?php
$variable1 = $_GET['vorname'];
$variable2 = $_GET['nachname'];
echo "Hello " . $variable1 . " " . $variable2 . "!";
php

Der Aufruf der des Skripts erfolgt durch folgende URL:

localhost/hello.php?vorname=John&nachname=Doe

Wir übergeben somit die Parameter vorname=John und nachname=Doe. Die Ausgabe der Werte erfolgt wie bisher mithilfe des Sprach­kon­strukts echo.

Bild: Datenübergabe mittels $_GET
Mit $_GET können Sie Werte für Ihre Variablen aus der URL lesen.

Eine Da­ten­über­ga­be via $_GET führt zwangs­läu­fig dazu, dass die über­tra­ge­nen Daten in der Adress­zei­le sichtbar sind. Es lässt sich somit jederzeit nach­voll­zie­hen, welche Parameter übergeben werden. Dies hat den Vorteil, dass Variablen in Hy­per­links ge­spei­chert werden können. Zudem haben In­ter­net­nut­ze­rin­nen und -nutzer die Mög­lich­keit, URLs inklusive HTTP-Query-String als Le­se­zei­chen im Browser abzulegen.

Dass GET-Parameter in Klartext in der URL auf­ge­führt werden, dis­qua­li­fi­ziert diese Methode jedoch für die Übergabe sensibler Daten, wie sie bei­spiels­wei­se bei On­line­for­mu­la­ren anfallen. Darüber hinaus ist der Umfang der Daten, die Mittels $_GET übergeben werden können, durch die Ma­xi­mal­län­ge von URLs begrenzt.

Hinweis

Umgehen lassen sich diese Ein­schrän­kun­gen mit der HTTP-Methode POST. Die damit über­ge­be­nen Daten finden Sie in der Su­per­glo­bal $_POST.

Da­ten­über­ga­be via $_POST

Die HTTP-Methoden GET und POST un­ter­schei­den sich in der Art der Da­ten­über­ga­be: Während die zu über­tra­gen­den Daten bei der GET-Methode als URL-Parameter übergeben werden, erfolgt die Da­ten­über­ga­be via $_POST im Body einer HTTP-Anfrage. Dies er­mög­licht es, auch große Da­ten­men­gen von einem Skript an ein anderes zu übergeben.

Ein zentrales An­wen­dungs­feld der HTTP-POST-Methode ist die Über­tra­gung von HTML-For­mu­lar­da­ten. Wir de­mons­trie­ren das am Beispiel einer News­let­ter-Anmeldung. Erstellen Sie dazu eine neue PHP-Datei mit dem Namen „seite1.php“ und über­neh­men Sie folgenden Codeblock:

<form method="post" action="seite2.php" >
Bitte senden Sie den Newsletter an: <br />
Ihr Vorname: <input type="text" name="vorname" /><br />
Ihr Nachname: <input type="text" name="nachname" /><br />
Ihre E-Mail-Adresse: <input type="text" name="email" /><br />
<input type="submit" value="Formular absenden" />
</form>
html

Zur Er­stel­lung von For­mu­la­ren kommt das HTML-Element <form> zum Einsatz. Dieses enthält im Start-Tag zwei Attribute: method und action. Mit dem method-Attribut de­fi­nie­ren Sie die Über­tra­gungs­me­tho­de, in diesem Fall HTTP-POST. Im action-Attribut wird die URL eines Skripts hin­ter­legt, das sämtliche Daten empfängt, die über nach­fol­gen­de Ein­ga­be­fel­der erfasst werden. Das Beispiel zeigt ein HTML-Formular mit drei Ein­ga­be­ele­men­ten (input type="text") und einem Absende-Button (input type="submit"). Als Empfänger der Daten ist die Datei „seite2.php“ definiert.

Um die Da­ten­über­ga­be mittels $_POST zu ver­an­schau­li­chen, nutzen wir für die Aus­wer­tung der For­mu­lar­da­ten ein einfaches Skript, das die über­mit­tel­ten Werte als PHP-Variablen speichert und in Textform ausgibt. Erstellen Sie dazu eine Datei „seite2.php“ und fügen Sie folgenden Pro­gramm­code ein:

<?php
$vorname = $_POST["vorname"];
$nachname = $_POST["nachname"];
$email = $_POST["email"];
echo "Hallo " . $vorname . " " . $nachname . ", <br />
Sie haben sich mit folgender E-Mail-Adresse registriert: " . $email . ".";
php

Speichern Sie die beiden PHP-Dateien im „htdocs“-Ordner Ihres Test­ser­vers und rufen Sie „seite1.php“ über folgende URL im Web­brow­ser auf: http://localhost/seite1.php. Ihr Browser zeigt Ihnen nun die in­ter­ak­ti­ve Web­ober­flä­che Ihres HTML-Formulars.

Bild: Dateneingabe via HTML-Formular
Sie können im HTML-Formular nun Werte eingeben, die zu Ihrem anderen Skript über­tra­gen werden.

Geben Sie beliebige An­mel­de­da­ten ein und drücken Sie den Absende-Button, um Variablen von einem Skript zum anderen zu über­tra­gen. Sobald Sie die Eingabe auf „seite1.php“ bestätigt haben, werden Sie umgehend auf „seite2.php“ wei­ter­ge­lei­tet. Das Brow­ser­fens­ter zeigt das Ergebnis der Skript­aus­füh­rung auf Basis der über­mit­tel­ten Daten.

Bild: Ausgabe der Benutzerdaten
Die Daten wurden nun zum anderen Skript über­tra­gen.

Nut­zer­ein­ga­ben, die über die In­put­fel­der von „seite1.php“ erfasst werden, werden von „seite2.php“ über folgendes Schema abgerufen:

$_POST["Name des Inputfeldes"]

So ruft die Zeile $vorname = $_POST["vorname"] die Eingabe im Inputfeld vorname ab und speichert diese in der Variable $vorname. Die Variable $vorname wiederum lässt sich mittels echo als String ausgeben.

Das if-Konstrukt und die PHP-Ver­gleichs­ope­ra­to­ren

Bisher haben wir Variablen definiert, diese von einem Skript zum nächsten über­tra­gen und als String aus­ge­ge­ben. Im nächsten Schritt werden Sie lernen, die Aus­füh­rung von Code­frag­men­ten an bestimmte Be­din­gun­gen zu knüpfen.

Das Sprach­kon­strukt if gibt Ihnen die Mög­lich­keit, Skripte so zu schreiben, dass An­wei­sun­gen erst dann zum Tragen kommen, wenn eine durch Sie de­fi­nier­te Bedingung erfüllt ist – bei­spiels­wei­se die Eingabe eines korrekten Passworts.

Be­din­gun­gen werden in PHP nach folgendem Grund­ge­rüst definiert:

<?php
if(expression)
{
statement;
}
php

Dieses liest sich fol­gen­der­ma­ßen: Nur dann, wenn die Bedingung in der expression erfüllt ist, wird das statement aus­ge­führt. Erfüllt ist eine Bedingung immer dann, wenn das if-Konstrukt das Ergebnis TRUE (wahr) zu­rück­gibt. An­dern­falls gilt diese als FALSE (falsch). In diesem Fall wird die Anweisung über­sprun­gen.

In der Regel prüft das if-Konstrukt, ob der Wert einer Variablen dem ent­spricht, was in der Bedingung definiert wurde. Rea­li­siert wird diese Kon­troll­struk­tur nor­ma­ler­wei­se auf Basis von Ver­gleichs­ope­ra­to­ren.

Ver­gleichs­ope­ra­to­ren

Ver­gleichs­ope­ra­to­ren kommen bei der For­mu­lie­rung von Be­din­gun­gen zum Einsatz, um zwei Argumente in eine logische Beziehung setzen, die als wahr (TRUE) oder falsch (FALSE) evaluiert werden kann. Kommen Ver­gleichs­ope­ra­to­ren in PHP-Kon­troll­struk­tu­ren zum Einsatz, werden diese auf zwei Variablen in der expression eines if-Kon­strukts an­ge­wen­det:

if ($a == $b)
{
statement;
}
php

Ver­sprach­licht lautet die Kon­troll­struk­tur: Wenn Variable $a ist gleich Variable $b gilt, dann werden die im statement de­fi­nier­ten An­wei­sun­gen aus­ge­führt.

Die PHP-Ver­gleichs­ope­ra­to­ren sind an die Pro­gram­mier­spra­che C angelehnt und un­ter­schei­den sich in ihrer Schreib­wei­se zum Teil erheblich von den klas­si­schen Symbolen der Ma­the­ma­tik. Eine Übersicht finden Sie in nach­ste­hen­der Tabelle.

Ver­gleichs­ope­ra­tor Be­schrei­bung Bedingung
== ist gleich Die Bedingung ist erfüllt, wenn $a und $b den gleichen Wert aufweisen.
=== ist identisch Die Bedingung ist erfüllt, wenn $a und $b den gleichen Wert aufweisen und demselben Datentyp angehören. Ver­an­schau­li­chen lässt sich dies an einem Beispiel, bei dem eine Integer (1) mit einem String (“1”) ver­gli­chen wird: 1 == "1" wird zu TRUE und 1 === "1" wird zu FALSE. Verwenden Sie für Be­din­gun­gen, die die Gleich­heit zweier Variablen vor­aus­set­zen, am besten immer den Ver­gleichs­ope­ra­tor === (ist identisch).
!= ist ungleich Die Bedingung ist erfüllt, wenn $a und $b ungleiche Werte aufweisen.
!== nicht identisch Die Bedingung ist erfüllt, wenn $a und $b ungleiche Werte aufweisen oder un­ter­schied­li­chen Da­ten­ty­pen angehören.
< ist kleiner als Die Bedingung ist erfüllt, wenn der Wert von $a kleiner ist als der Wert von $b.
> ist größer als Die Bedingung ist erfüllt, wenn der Wert von $a größer ist als der Wert von $b.
<= ist kleiner oder gleich Die Bedingung ist erfüllt, wenn der Wert von $a kleiner ist als der Wert von $b oder $a und $b den gleichen Wert aufweisen.
>= ist größer oder gleich Die Bedingung ist erfüllt, wenn der Wert von $a größer ist als der Wert von $b oder $a und $b den gleichen Wert aufweisen.

Folgendes Skript soll diese Kon­troll­struk­tur ver­deut­li­chen. Ver­gli­chen werden zwei Integers. Als Ver­gleichs­ope­ra­tor kommt < (ist kleiner) zum Einsatz:

<?php
$zahl1 = 10;
$zahl2 = 20;
if($zahl1 < $zahl2) {
echo "Die Bedingung ist erfüllt";
}
php

Wir de­fi­nie­ren die Variablen $zahl1 und $zahl2 und weisen diesen die Werte 10 und 20 zu. Im Anschluss stellen wir eine Bedingung auf: Wenn $zahl1 kleiner ist als $zahl2, soll der in der echo-Anweisung auf­ge­führ­te String aus­ge­ge­ben werden.

Das Ergebnis der Skript­aus­füh­rung enthält die Antwort: 10 ist kleiner als 20. Das if-Konstrukt gibt das Ergebnis TRUE zurück. Die Bedingung ist erfüllt.

Bild: Das Sprachkonstrukt if in der Anwendung
Der Code nach der if-Anweisung wird aus­ge­führt, wenn die spe­zi­fi­zier­te Bedingung zutrifft.

Möchten Sie An­wei­sun­gen de­fi­nie­ren, die aus­ge­führt werden, sobald eine Bedingung nicht erfüllt wurde, ergänzen Sie die if-Kon­troll­struk­tur um das Sprach­kon­strukt else zu einem If-Else-Statement in PHP:

<?php
if(Bedingung a)
{
Anweisung b;
}
else
{
Anweisung c;
}
php

Auch dieses Skript prüft, ob die Bedingung a das Ergebnis TRUE oder FALSE zu­rück­gibt. Ist die Bedingung a erfüllt, wird Anweisung b aus­ge­führt. Ist die Bedingung a nicht erfüllt (FALSE), wird Anweisung b über­sprun­gen und statt­des­sen Anweisung c aus­ge­führt.

Wir erweitern unser Skript um das else-Konstrukt und tauschen den Ver­gleichs­ope­ra­tor < (ist kleiner) gegen == (ist gleich):

<?php
$zahl1 = 10;
$zahl2 = 20;
if($zahl1 == $zahl2)
{
echo "Die Bedingung ist erfüllt";
}
else
{
echo "Die Bedingung ist nicht erfüllt";
}
php

Diesmal gibt das if-Konstrukt das Ergebnis FALSE zurück. Der Wert der Variable $zahl1 ist nicht gleich dem Wert der Variable $zahl2. Die Bedingung ist nicht erfüllt. Es wird somit nicht die unter if auf­ge­führ­te Anweisung aus­ge­führt, sondern die unter else de­fi­nier­te.

Bild: Das Sprachkonstrukt else in der Anwendung
Wenn die if-Bedingung nicht zutrifft, wird der Code hinter dem else-Statement aus­ge­führt.
Hinweis

Soll die Aus­füh­rung eines Code­frag­ments an die Gleich­heit zweier Werte gebunden werden, kommt in PHP ein doppeltes Gleich­heits­zei­chen (==) zum Einsatz. Das einfache Gleich­heits­zei­chen (=) verwenden Sie aus­schließ­lich bei der Zuweisung von Werten zu Variablen.

Die Negation von Be­din­gun­gen erfolgt durch ein vor­an­ge­stell­tes Aus­ru­fe­zei­chen (!).

<?php
$zahl1 = 10;
$zahl2 = 20;
if ($zahl1 == $zahl2)
{
echo "Die Zahlen sind gleich.";
}
if (!($zahl1 == $zahl2))
{
echo "Die Zahlen sind nicht gleich.";
}
php

Das Beispiel zeigt die Bedingung $zahl1 == $zahl2 und deren Ver­nei­nung. !($zahl1 == $zahl2) ent­spricht ($zahl1 != $zahl2).

Eine prak­ti­sche Anwendung von if und else ist bei­spiels­wei­se die Pass­wort­ab­fra­ge auf Basis eines HTML-Formulars. Wir si­mu­lie­ren diese erneut mithilfe unserer PHP-Dateien „seite1.php“ und „seite2.php“.

Öffnen Sie „seite1.php“ und fügen Sie folgenden For­mu­lar­code ein:

<form action="seite2.php" method="post">
Bitte geben Sie Ihr Passwort ein: <input type="password" name="passwort" />
<input type="submit" value="Absenden" />
</form>
html

Der Aufbau ent­spricht dem bereits er­stell­ten Formular. Diesmal genügt uns jedoch ein Ein­ga­be­feld: die Pass­wort­ab­fra­ge. Wie zuvor werden Be­nut­zer­ein­ga­ben an das Skript „seite2.php“ über­mit­telt.

Dieses passen wir mit folgendem Code so an, dass die Pass­wort­ein­ga­be mit einem hin­ter­leg­ten Passwort ab­ge­gli­chen wird:

<?php
$passwort = $_POST["passwort"];
if($passwort=="qwertz123")
{
echo "Das Passwort war korrekt";
}
else
{
echo "Das Passwort war falsch";
}
php

Der Code liest sich wie folgt: Zunächst weisen wir der Variable $passwort in Zeile 2 einen Wert zu, den wir über die HTTP-POST-Methode abrufen. Im Anschluss de­fi­nie­ren wir folgende Kon­troll­struk­tur: Das if-Kontrukt in Zeile 3 soll prüfen, ob der Wert der Variable $passwort mit dem String qwertz123 über­ein­stimmt. Ist dies der Fall, wird der String „Das Passwort war korrekt“ aus­ge­ge­ben. Gibt if das Ergebnis FALSE zurück, kommt else in Zeile 7 zum Einsatz und es wird der String „Das Passwort war falsch“ aus­ge­ge­ben.

Nun rufen wir das Skript „seite1.php“ über die URL http://localhost/seite1.php auf.

Bild: Weboberfläche des HTML-Formulars zur Passwortabfrage
Im Web­for­mu­lar können Sie nun ein Passwort eingeben.

Der Browser prä­sen­tiert uns die Web­an­sicht unseres HTML-Formulars zur Pass­wort­ab­fra­ge. Wir kommen der Auf­for­de­rung nach, geben das in Skript „seite2.php“ de­fi­nier­te Passwort „qwertz123“ ein und klicken auf den Absenden-Button.

Bild: Die Passwortabfrage war korrekt
Wenn Sie das richtige Passwort ein­ge­ge­ben haben, greift die if-Bedingung aus dem Skript und eine Er­folgs­mel­dung wird angezeigt.

Der Web­brow­ser leitet uns au­to­ma­tisch auf „seite2.php“ um. Im Hin­ter­grund gleicht die if-Kon­troll­struk­tur unsere Eingabe mit dem hin­ter­leg­ten Passwort ab und kommt zu dem Ergebnis „qwertz123 == qwertz123 ist TRUE“ und gibt den String „Das Passwort war korrekt“ aus. Testen Sie selbst, was passiert, wenn Sie ein ab­wei­chen­des Passwort in das Ein­ga­be­feld tippen.

Logische Ope­ra­to­ren

Be­din­gun­gen, die Sie mithilfe von Ver­gleichs­ope­ra­to­ren in der Ex­pres­si­on des if-Kon­strukts de­fi­nie­ren, lassen sich bei Bedarf mit weiteren Be­din­gun­gen in derselben Ex­pres­si­on ver­knüp­fen. PHP stützt sich dabei auf die logischen Ope­ra­to­ren AND und OR.

Enge Bindung Schwache Bindung Be­schrei­bung
&& AND Beide Be­din­gun­gen, die mit dem Operator verbunden sind, müssen TRUE sein.
` `

Um Be­din­gun­gen zu ver­knüp­fen, stehen Ihnen in PHP logische Ope­ra­to­ren mit enger und mit schwacher Bindung zur Verfügung. Nutzen Sie lediglich eine der beiden Schreib­wei­sen, werden Sie in der Praxis keinen Un­ter­schied bemerken. Kom­bi­nie­ren Sie beide Schreib­wei­sen, werden Sie fest­stel­len, dass && und || enger binden als AND und OR. Ver­gleich­bar ist dies mit der Operator-Rangfolge, wie sie von ma­the­ma­ti­schen Ope­ra­to­ren bekannt ist (z. B. Punkt vor Strich: * bindet enger als +).

Ein pra­xis­na­hes Beispiel bietet wiederum die Pass­wort­ab­fra­ge. In der Regel umfassen An­mel­de­da­ten ein geheimes Passwort sowie einen Be­nut­zer­na­men. Nur wenn beide Eingaben mit den im System hin­ter­leg­ten Daten über­ein­stim­men, ist der Log-in er­folg­reich.

Wir öffnen erneut unser Formular zur Pass­wort­ab­fra­ge in „Seite1.php“ und ergänzen ein Ein­ga­be­feld für den Be­nut­zer­na­men:

<form action="seite2.php" method="post">
Benutzername: <input type="text" name="username" /><br />
Passwort: <input type="password" name="passwort" /><br />
<input type="submit" value="Absenden" />
</form>
html

Im nächsten Schritt müssen wir auch die Kon­troll­struk­tur des if-Kon­strukts anpassen. Wir nutzen dazu den logischen Operator AND, um die Bedingung für die Pass­wort­ab­fra­ge mit einer Bedingung für die Abfrage des Be­nut­zer­na­mens zu ver­knüp­fen.

<?php
$username = $_POST["username"];
$passwort = $_POST["passwort"];
if($username=="John Doe" AND $passwort=="qwertz123")
{
echo "Willkommen im internen Bereich " . $username . "!";
}
else
{
echo "Zugriff fehlgeschlagen";
}
php

Unser Skript „seite2.php“ bekommt nun die Werte für username und passwort übergeben und speichert diese in den Variablen $username und $passwort. Die Ex­pres­si­on des if-Kon­strukts enthält nun zwei Be­din­gun­gen, die mit dem logischen Operator AND verbunden sind. Nur wenn beide Be­din­gun­gen erfüllt sind (username=="John Doe" und $passwort=="qwertz123"), gibt if das Ergebnis TRUE zurück.

Da wir durch das Ein­ga­be­feld username den Be­nut­zer­na­men erhalten, können wir diesen direkt für die Text­aus­ga­be via echo verwenden: Auf „Will­kom­men im internen Bereich“ folgt der Wert der Variable $username. Ist eine der beiden Be­din­gun­gen nicht erfüllt, erhalten wir die Text­aus­ga­be: „Zugriff fehl­ge­schla­gen“.

Bild: Passwortabfrage mit zwei Bedingungen
Nur, wenn beide Be­din­gun­gen, die mit AND verknüpft sind, zu TRUE auswerten, ist die Anmeldung er­folg­reich.

Logische Ope­ra­to­ren lassen sich beliebig kom­bi­nie­ren. Dabei gilt: AND hat eine höhere Operator-Rangfolge als OR. Wie bei ma­the­ma­ti­schen Glei­chun­gen können Sie auch bei PHP Klammern nutzen, um die Rangfolge zu be­ein­flus­sen.

Be­din­gun­gen mit match

Bisher haben wir Ent­schei­dun­gen in PHP mit if- und else-An­wei­sun­gen umgesetzt. Wenn jedoch ein einzelner Wert geprüft wird und je nach Wert un­ter­schied­li­che Er­geb­nis­se entstehen sollen, kann der Code mit if schnell un­über­sicht­lich werden. Genau für solche Fälle gibt es die Anweisung match.

<?php
$status = 404;
echo match ($status) {
200 => "OK",
404 => "Nicht gefunden",
default => "Unbekannter Status",
};
php

In diesem Beispiel wird der Wert der Variable $status geprüft. Ent­spricht er dem Wert 200, liefert match den Text „OK“ zurück. Ist der Wert 404, wird „Nicht gefunden“ gesetzt. Trifft keiner der genannten Werte zu, greift der default-Fall und es wird „Unbekannt“ verwendet.

Bild: Meldung „Nicht gefunden“
Da die Variable $status auf den Wert 404 gesetzt ist, greift der zweite Fall der match-Bedingung und wir erhalten die Meldung „Nicht gefunden“.

Der wich­tigs­te Un­ter­schied zu if-else besteht darin, dass match direkt einen Wert zu­rück­gibt, der einer Variablen zu­ge­wie­sen werden kann. Dadurch entfällt mehr­fa­ches Schreiben von Zu­wei­sun­gen innerhalb einzelner Be­din­gun­gen, und der Code bleibt kürzer, über­sicht­li­cher und leichter ver­ständ­lich.

Schleifen (while, for)

Manchmal ist es notwendig, dass ein Skript einen be­stimm­ten Code­ab­schnitt mehrmals durch­läuft, bevor der restliche Pro­gramm­code aus­ge­führt wird. Pro­gram­mier­spra­chen nutzen dafür das Konzept der Schleife – auch PHP-Loops genannt. Dabei un­ter­schei­det man drei Typen von Schleifen:

  • while-Schleifen
  • do-while-Schleifen
  • for-Schleifen

while-Schleifen

Bei der while-Schleife handelt es sich um den sim­pels­ten Schlei­fen­typ, der Ihnen in PHP zur Verfügung steht. Der Grund­auf­bau ent­spricht folgendem Schema:

while (Bedingung)
{
Schleifenschritt und andere Anweisungen
}
php

Die while-Schleife weist PHP an, un­ter­ge­ord­ne­te An­wei­sun­gen so lange aus­zu­füh­ren, wie die while-Bedingung erfüllt ist. Dazu prüft der PHP-In­ter­pre­ter die Bedingung zu Beginn eines jeden Schlei­fen­durch­gangs. Gestoppt wird die Aus­füh­rung des un­ter­ge­ord­ne­ten Codes erst dann, wenn die while-Bedingung nicht mehr erfüllt ist.

Ver­an­schau­li­chen lässt sich dieses Prinzip an einem einfachen Zählskript:

<?php
$zahl = 1;
while ($zahl <= 10) {
echo $zahl++ . "<br />";
}
php

Im Abschnitt „Rechnen mit Variablen“ wurde das Prinzip des In­kre­men­tie­rens ein­ge­führt. In folgendem Skript greifen wir darauf zurück, nutzen diesmal jedoch einen Post-Inkrement-Operator, um den Wert der Integer-Variable $zahl pro Schlei­fen­durch­gang erst nach der Text­aus­ga­be via echo um 1 zu erhöhen. Als Bedingung für die while-Schleife de­fi­nie­ren wir: $zahl kleiner/gleich 10. Die Anweisung echo wird somit so lange wie­der­holt, bis die $zahl einen Wert größer 10 an­ge­nom­men hat.

Bild: Das Skript zählt bis 10 und bricht dann ab
Sobald der Wert 10 erreicht ist, bricht die Schleife ab.

Das Ergebnis der Skript­aus­füh­rung ist ein String, der für jeden Schlei­fen­durch­gang den Wert der Variable $zahl ausgibt, bevor dieser in­kre­men­tiert wird. Das Skript zählt somit von 1 bis 10 und beendet die Code­aus­füh­rung, sobald die while-Bedingung nicht mehr erfüllt ist.

do-while-Schleifen

Der Aufbau der do-while-Schleife gleicht dem der while-Schleife. Der Un­ter­schied ist nur, dass die Bedingung nicht am Anfang jedes Schlei­fen­durch­gangs, sondern erst am Ende geprüft wird. Das Grund­sche­ma einer do-while-Schleife ent­spricht folgendem Beispiel:

do {
Schleifenschritt und andere Anweisungen
}
while (Bedingung)
php

Als do-while-Schleife pro­gram­miert, würde das vor­her­ge­hen­de Skript fol­gen­der­ma­ßen aussehen:

<?php
$zahl = 1;
do {
echo $zahl++ . "<br />";
}
while ($zahl <= 10);
php

Das Ergebnis bleibt in diesem Fall das Gleiche. Das Besondere an der do-while-Schleife ist, dass diese min­des­tens einmal durch­lau­fen wird, selbst wenn die Bedingung in keinem Schlei­fen­durch­gang erfüllt wird.

for-Schleifen

Grund­sätz­lich hat die for-Schleife in einem PHP-Skript dieselbe Funk­tio­na­li­tät wie die while-Schleife. Anders als bei dieser werden Startwert, Bedingung und Anweisung jedoch innerhalb einer Zeile notiert und nicht über drei oder mehr Zeilen verteilt. Der Grund­auf­bau der for-Schleife ent­spricht folgendem Schema:

for (Startwert; Bedingung; Schleifenschritt)
Anweisungen
php

Das bereits bekannte Beispiel ließe sich somit als for-Schleife in kompakter Form notieren:

<?php
for($zahl = 1; $zahl <= 10; $zahl++) {
echo $zahl . "<br /> ";
}
php

Zunächst wird für die Variable $zahl der Wert „1“ definiert. Dann prüft PHP, ob die Bedingung $zahl <= 10 erfüllt ist. Trifft dies zu, wird die Schleife fort­ge­setzt und die An­wei­sun­gen unterhalb der Schleife werden aus­ge­führt (hier die Anweisung echo). Erst danach wird der Schlei­fen­schritt aus­ge­führt; in diesem Fall spielt es keine Rolle, ob Sie Prä- oder Post-In­kre­men­tie­rung wählen, weil diese Anweisung auf jeden Fall vor der Ausgabe aus­ge­führt wird. Ist der Schlei­fen­schritt ab­ge­schlos­sen, beginnt der nächste Schlei­fen­durch­gang.

Startwert, Bedingung und Schlei­fen­schritt sind optionale Elemente einer for-Schleife. Theo­re­tisch sind selbst leere Schleifen möglich. Diese wären jedoch redundant.

Grund­sätz­lich ist es Ihnen über­las­sen, ob Sie Ihre PHP-Skripte mit einer for- oder einer while-Schleife schreiben. Es gibt jedoch ein Argument, das dafür spricht, for-Schleifen zu be­vor­zu­gen: Kommen for-Schleifen zum Einsatz, haben Sie die Rah­men­da­ten der Schleife besser im Blick. Dies beugt der Gefahr vor, aus Versehen eine Forever-Schleife zu schreiben, die so lange läuft, bis der Speicher des In­ter­pre­ters voll ist. Dies passiert Ihnen in Bezug auf das vor­her­ge­hen­de Beispiel dann, wenn Sie vergessen, den Wert der Variable $zahl zu erhöhen.

Soll die Schleife un­ab­hän­gig von der Bedingung jedoch min­des­tens einmal durch­lau­fen werden, ist die do-while-Schleife die Schleife der Wahl.

break und continue

Der Ablauf einer while-, do-while- oder for-Schleife lässt sich durch die An­wei­sun­gen break und continue be­ein­flus­sen. Nutzen Sie break, um den Ablauf einer Schleife an einer be­lie­bi­gen Stelle zu un­ter­bre­chen, und continue, um einen Schlei­fen­durch­gang zu über­sprin­gen. Beide An­wei­sun­gen werden mittels if an eine Bedingung gebunden. Folgendes Beispiel zeigt unser Zählskript mit einem break:

<?php
for ($zahl = 1; $zahl <= 10; $zahl++) {
if ($zahl == 5) {
echo "Bei 5 brechen wir das Skript ab!";
break;
}
echo $zahl . "<br /> ";
}
php

In der for-Schleife haben wir definiert, dass der Wert der Variable $zahl ausgehend von einem Startwert 1 in jeder Schlei­fen­run­de um den Wert 1 erhöht werden soll, bis die Variable den Wert 10 erreicht hat. Diese Schleife stoppen wir nun vorzeitig mit der Anweisung break, sobald $zahl den Wert 5 erreicht hat. Das Sprach­kon­strukt echo gibt somit lediglich die Zahlen 1 bis 4 aus.

Bild: for-Schleife mit break
Mit break können Sie aus einer Schleife her­aus­sprin­gen, sobald eine bestimmte if-Bedingung erfüllt ist.

Möchten wir lediglich die Ausgabe der fünften Runde über­sprin­gen, nicht jedoch den gesamten Schlei­fen­ab­lauf stoppen, ersetzen wir die Anweisung break durch continue:

<?php
for ($zahl=1; $zahl <= 10; $zahl++) {
if ($zahl == 5) {
echo "Die 5 lassen wir aus!<br />";
continue;
}
echo $zahl . "<br /> ";
}
php

Statt der Ziffer 5 gibt uns PHP den unter if de­fi­nier­ten Text­string „Die 5 lassen wir aus!“ aus.

Bild: for-Schleife mit continue-Anweisung
Mit continue können Sie einen Schlei­fen­durch­lauf über­sprin­gen, wenn eine bestimmte Bedingung eintritt.

Da­tei­ope­ra­tio­nen

Dy­na­mi­schen Web­in­hal­ten liegt eine Trennung von Inhalt und Prä­sen­ta­ti­on zugrunde. Skript­spra­chen wie PHP stellen daher ver­schie­de­ne Funk­tio­na­li­tä­ten zur Verfügung, die es er­mög­li­chen, Inhalte aus externen Da­ten­quel­len in zentrale Template-Files zu laden. In der Praxis handelt es sich bei diesen Da­ten­quel­len meist um Da­ten­ban­ken, die mithilfe von Ma­nage­ment­sys­te­men wie MySQL verwaltet werden. Darüber hinaus besteht die Mög­lich­keit, Daten aus Dateien ein­zu­bin­den. Im Folgenden zeigen wir Ihnen, wie Sie Dateien als String in einem PHP-Skript einlesen und Text­aus­ga­ben Ihres Skripts in Dateien speichern.

Dateien einlesen

Um den Inhalt einer Datei ein­zu­le­sen, stellt PHP diverse Funk­tio­nen bereit, von denen sich für unsere Zwecke ins­be­son­de­re file() und file_get_contents() anbieten. Während die Funktion file_get_contents() den gesamten Inhalt einer Datei in einen String liest, speichert die Funktion file() den Inhalt als Array. Jedes Element des Arrays ent­spricht einer Zeile der Datei. Mittels file() ist es somit einfacher möglich, jede Zeile einzeln aus­zu­ge­ben.

Wir de­mons­trie­ren die PHP-Da­tei­ope­ra­tio­nen an der Textdatei „beispiel.txt“, die wir im Ordner „htdocs“ unseres Test­ser­vers ablegen. Inhalt der Datei sind vier Zeilen Blindtext:

Bild: Textdatei mir vier Zeilen Beispieltext
In unserer Textdatei sind vier Beispiel-Blind­text­zei­len.

Zunächst lesen wir die gesamte Datei als String ein. Dazu müssen wir der Funktion file_get_contents() den Namen der ent­spre­chen­den Datei als Parameter zuweisen. Dies geschieht nach folgendem Schema:

file_get_contents('beispiel.txt')

Nun haben wir die Mög­lich­keit, mit dem ein­ge­le­se­nen String zu arbeiten. Wir können diesen bei­spiels­wei­se einer Variablen zuweisen und als Text im Web­brow­ser ausgeben:

<?php
$beispiel = file_get_contents('beispiel.txt');
echo $beispiel;
php

In der Brow­ser­an­sicht sehen wir, dass der Text­string ohne Absätze ausgeben wird. Die Zei­len­um­brü­che der Ori­gi­nal­da­tei werden nicht sichtbar. Dies hängt damit zusammen, dass der Web­brow­ser die Text­aus­ga­be des Skripts als HTML-Code in­ter­pre­tiert. Umbrüche, die in Text­edi­to­ren definiert wurden, gehen dabei verloren.

Bild: Das Skript liest die Datei beispiel.txt aus
Mit der Funktion file_get_contents() können Sie den Inhalt einer Datei lessn und dann in PHP ver­ar­bei­ten.

Möchten Sie an der ur­sprüng­li­chen Struktur fest­hal­ten, haben Sie ver­schie­de­ne Mög­lich­kei­ten. Sie können die HTML-Codierung für den Zei­len­um­bruch (<br>) in der Aus­gangs­da­tei manuell mittels Suchen und Ersetzen ergänzen, ein <pre> um den Datei-Inhalt setzen, dem Bereich die CSS-Ei­gen­schaft white-space: pre-wrap zuweisen oder Sie nutzen die Funktion nl2br(), um PHP zu si­gna­li­sie­ren, dass Zei­len­um­brü­che au­to­ma­tisch in HTML-Zei­len­um­brü­che um­ge­wan­delt werden sollen. Die Funktion verwenden Sie nach folgendem Schema:

<?php
$beispiel = file_get_contents('beispiel.txt');
echo nl2br($beispiel);
php

Wird das Sprach­kon­strukt echo in Kom­bi­na­ti­on mit nl2br() verwendet, fügt PHP vor jeder neuen Zeile einen HTML-Zei­len­um­bruch ein.

Bild: Die Funktion nl2br() in der Anwendung
Mit der PHP-Funktion nl2br() können Sie Zei­len­um­brü­che erzeugen.

Möchten Sie die Zeilen einer Datei einzeln ausgeben, bietet sich die Funktion file() an. Diese liest eine Datei ein, num­me­riert alle Zeilen beginnend mit 0 durch und speichert deren Inhalte als Elemente eines Arrays. Über­tra­gen auf unser Beispiel ergibt sich somit folgende Zuordnung:

[0] = Lorem ipsum dolor sit amet, consectetuer adipiscing elit

[1] = Aenean commodo ligula eget dolor. Aenean massa.

[2] = Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

[3] = Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.

Um die je­wei­li­gen Inhalte mittels echo aus­zu­ge­ben, müssen Sie lediglich die ge­wünsch­te Zei­len­num­mer angeben. So liefert uns das folgende Skript bei­spiels­wei­se lediglich die erste Zeile der Datei „beispiel.txt“ als Ausgabe für den Browser:

<?php
$beispiel = file("beispiel.txt");
echo $beispiel [0];
php
Bild: Die Funktion file() in der Anwendung
Die Funktion file() eiget sich zum Auslesen einzelner Zeilen aus einer Datei.

Dateien schreiben

Mit PHP lassen sich nicht nur Dateien auslesen. Die Skript­spra­che gibt Ihnen auch die Mög­lich­keit, Dateien zu erstellen und diese mit Inhalten zu be­schrei­ben.

Wir nutzen dazu die PHP-Funktion file\_put_contents(). Diese erwartet zwei Parameter: Den Namen der Datei, die erstellt oder ak­tua­li­siert werden soll, sowie die Daten in Form eines Strings oder Arrays. Folgendes Skript erstellt die Datei test.txt und schreibt den String Das ist ein Test! in die erste Zeile. Der Zusatz \r\n führt zu einem Zei­len­um­bruch in der Zieldatei.

<?php
file_put_contents("test.txt", "Das ist ein Test! \r\n");
echo "test.txt wurde erstellt!";
php

Da uns file_put_contents keine Ausgabe für den Browser liefert, ergänzen wir eine echo-Anweisung, die uns ausgibt, welche Aktion durch­ge­führt wird.

Bild: Dateioperationen: Dateien schreiben
Mit der Funktion file_put_contents() können Sie Dateien schreiben.

Findet sich im Ziel­ord­ner bereits eine gleich­na­mi­ge Datei, wird diese über­schrie­ben. Dies ver­hin­dern Sie, indem Sie den Parameter FILE_APPEND setzen:

<?php
file_put_contents("test.txt","Der Test war erfolgreich! \r\n", FILE_APPEND);
echo "test.txt wurde aktualisiert!";
php

Nutzen Sie file_put_contents() mit dem Parameter FILE_APPEND, werden neue Inhalte an bereits be­stehen­de angehängt.

Bild: Dateioperationen: Dateien aktualisieren
Wenn Sie den Parameter FILE_APPEND hin­zu­fü­gen, dann werden die Inhalte, die Sie file_put_contents übergeben, an Ihre Datei an­ge­han­gen.

Was PHP in die Zieldatei schreibt, muss nicht zwangs­läu­fig im Skript definiert werden. Al­ter­na­tiv haben Sie die Mög­lich­keit, Inhalte von einer Datei in eine andere zu über­tra­gen. Folgendes Skript liest den Inhalt von beispiel.txt aus und fügt diesen in die Datei test.txt ein:

<?php
$beispiel = file_get_contents("beispiel.txt");
file_put_contents("test.txt", $beispiel, FILE_APPEND);
echo "test.txt wurde aktualisiert!";
php
MyWebsite Now Plus
Erstellen Sie Ihre Fir­men­web­site
  • Ver­schie­de­ne Designs inkl. Domain und E-Mail-Adresse
  • Über 17.000 li­zenz­freie Fotos & SEO-Funk­tio­nen
  • Ergänzung der Website um digitales Booking-Tool

Ob­jekt­ori­en­tier­te Pro­gram­mie­rung

Die ob­jekt­ori­en­tier­te Pro­gram­mie­rung (OOP) ist eine Methode, um Programme in kleine, über­schau­ba­re Bausteine, die so­ge­nann­ten Objekte, zu un­ter­tei­len. Jedes Objekt gehört zu einer Klasse, die be­schreibt, welche Ei­gen­schaf­ten und Methoden es besitzt. Ei­gen­schaf­ten sind dabei Variablen, die Merkmale des Objekts speichern, während Methoden Funk­tio­nen sind, die das Objekt ausführen kann. OOP hilft, den Code besser zu struk­tu­rie­ren, wie­der­ver­wend­bar zu machen und leichter zu warten, ins­be­son­de­re bei größeren Projekten.

Klassen

Eine Klasse ist die Vorlage für ein Objekt. Man kann sich eine Klasse wie einen Bauplan vor­stel­len, zum Beispiel für ein Auto, während ein Objekt das konkrete Auto ist, das nach diesem Bauplan erstellt wurde. Sie definiert, welche Daten ein Objekt enthält und welche Funk­tio­nen es ausführen kann. Im folgenden Beispiel sehen wir die Klasse Auto:

class Auto {
public string $marke;
public string $modell;
public function fahren() {
echo "Das Auto fährt!";
}
}
$meinAuto = new Auto();
$meinAuto->marke = "VW";
$meinAuto->modell = "Golf";
$meinAuto->fahren();
php

In diesem Beispiel wird die Klasse Auto definiert, die zwei Ei­gen­schaf­ten, $marke und $modell, sowie eine Methode fahren() besitzt. Danach wird ein Objekt dieser Klasse erstellt, indem $meinAuto die Klasse „Auto“ zu­ge­wie­sen wird. Mit -> greifen wir auf die Ei­gen­schaf­ten des Objekts zu und setzen $marke auf VW und $modell auf Golf. An­schlie­ßend rufen wir die Methode fahren()auf, die den Text „Das Auto fährt!“ ausgibt. Das Schlüs­sel­wort $this würde innerhalb der Methode auf das aktuelle Objekt verweisen.

Bild: Objekt der Auto-Klasse
Nachdem Sie ein Objekt der Auto-Klasse definiert haben, liefert ein Funk­ti­ons­auf­ruf von fahren() eine ent­spre­chen­de Ausgabe.

Con­s­truc­tor Property Promotion

Seit PHP 8.0 kann man Ei­gen­schaf­ten direkt im Kon­struk­tor, also der Methode, die beim Erstellen eines Objektes einer Klasse au­to­ma­tisch auf­ge­ru­fen wird, de­fi­nie­ren und in­itia­li­sie­ren. Dadurch entfällt die Not­wen­dig­keit, sie vorher in der Klasse separat zu de­kla­rie­ren, was den Code kürzer und über­sicht­li­cher macht.

class Produkt {
public function __construct(
public string $name,
public float $preis
) {}
}
$produkt = new Produkt("Tasse", 12.99);
echo $produkt->name;
echo $produkt->preis;
php

In diesem Beispiel werden die Ei­gen­schaf­ten name und preis direkt im Kon­struk­tor de­kla­riert. Beim Erstellen des Objekts Produkt werden die Werte „Tasse“ und „12.99“ übergeben. Mit $produkt->name und $produkt->preis greifen wir auf die Werte zu, die au­to­ma­tisch gesetzt wurden. Con­s­truc­tor Property Promotion spart also Schreib­ar­beit und macht den Code einfacher zu lesen.

In­ter­faces

Ein Interface legt fest, welche Methoden eine Klasse haben muss, ohne deren konkrete Umsetzung vor­zu­ge­ben. Klassen, die das Interface im­ple­men­tie­ren, müssen diese Methoden de­fi­nie­ren, sodass un­ter­schied­li­che Klassen ein­heit­lich behandelt werden können.

interface Fahrbar {
public function fahren();
}
class Auto implements Fahrbar {
public function fahren() {
echo "Das Auto fährt!";
}
}
$meinAuto = new Auto();
$meinAuto->fahren();
php

Hier definiert das Interface Fahrbar, dass jede im­ple­men­tie­ren­de Klasse eine Methode fahren() haben muss. Die Klasse Auto im­ple­men­tiert dieses Interface und definiert die Methode ent­spre­chend. An­schlie­ßend wird ein Objekt der Klasse erstellt und die Methode auf­ge­ru­fen, wodurch der Text „Das Auto fährt!“ aus­ge­ge­ben wird.

Bild: Objekt der Auto-Klasse nach dem Interface Fahrbar
Ein Interface definiert, dass unsere Klasse eine Methode namens fahren() be­inhal­ten muss.

In­ter­sec­tion Types

In­ter­sec­tion Types er­mög­li­chen es, dass ein Objekt mehrere In­ter­faces gleich­zei­tig erfüllen können muss. Das ist besonders praktisch, wenn eine Funktion si­cher­stel­len soll, dass ein Objekt bestimmte Fä­hig­kei­ten besitzt.

interface JsonSerializable {}
interface Loggable {}
function speichere(JsonSerializable&Loggable $objekt) {
echo "Objekt kann JSON speichern und protokollieren";
}
php

In diesem Beispiel müssen Objekte, die an die Funktion speichere() übergeben werden, sowohl das Interface JsonSerializable als auch Loggable im­ple­men­tie­ren. Die Kom­bi­na­ti­on der beiden In­ter­faces wird durch das & dar­ge­stellt. Dadurch ist ga­ran­tiert, dass die Funktion nur Objekte verwendet, die beide Ei­gen­schaf­ten besitzen.

Readonly Pro­per­ties

Readonly Pro­per­ties können nur einmal beim Erstellen eines Objekts gesetzt werden und danach nicht mehr verändert werden. Das ist besonders nützlich, um sensible Daten vor un­be­ab­sich­tig­ten Än­de­run­gen zu schützen.

class Benutzer {
public function __construct(
public readonly string $name
) {}
}
$benutzer = new Benutzer("Max");
echo $benutzer->name;
php

In diesem Beispiel wird die Ei­gen­schaft name direkt im Kon­struk­tor gesetzt und als readonly markiert. Das bedeutet, dass der Wert „Max“ nach der Er­stel­lung des Objekts nicht mehr verändert werden kann. Versuche, den Wert später zu ändern, führen zu einem Fehler. Readonly Pro­per­ties eignen sich gut für Daten, die un­ver­än­der­lich bleiben sollen, wie Benutzer-IDs oder Kon­fi­gu­ra­ti­ons­wer­te.

Property Hooks

Property Hooks erlauben es seit PHP-Version 8.4, Logik direkt beim Setzen oder Auslesen einer Ei­gen­schaft aus­zu­füh­ren. Das ist praktisch, wenn Werte au­to­ma­tisch ver­ar­bei­tet werden sollen.

class User {
public string $email {
set => strtolower($value);
get => strtoupper($this->email);
}
}
$user = new User();
$user->email = "Test@Example.com";
echo $user->email;
php

In diesem Beispiel wird beim Zuweisen eines Werts an die Ei­gen­schaft email au­to­ma­tisch alles in Klein­buch­sta­ben um­ge­wan­delt, während beim Auslesen au­to­ma­tisch alles in Groß­buch­sta­ben dar­ge­stellt wird. Dadurch kann man Daten kon­sis­tent ver­ar­bei­ten, ohne zu­sätz­li­che Methoden schreiben zu müssen.

Asym­me­tri­sche Sicht­bar­keit

Mit asym­me­tri­scher Sicht­bar­keit, die ebenfalls erst mit PHP-Version 8.4 ein­ge­führt wurde, kann man festlegen, dass eine Ei­gen­schaft öf­fent­lich gelesen, aber nur intern innerhalb der Klasse ge­schrie­ben werden darf. Das schützt wichtige Daten vor un­kon­trol­lier­ten Än­de­run­gen.

class Konto {
public private(set) float $guthaben = 0.0;
public function einzahlen(float $betrag) {
$this->guthaben += $betrag;
}
}
$konto = new Konto();
$konto->einzahlen(50);
echo $konto->guthaben;
php

In diesem Beispiel kann das Guthaben des Kontos öf­fent­lich aus­ge­le­sen werden, aber nur innerhalb der Klasse verändert werden. Die Methode einzahlen() erlaubt eine kon­trol­lier­te Erhöhung des Guthabens. Versuche, direkt auf $guthaben zu schreiben, führen zu einem Fehler. Auf diese Weise können wichtige Daten geschützt werden, während der Zugriff für erlaubte Ope­ra­tio­nen weiterhin möglich bleibt.

Sauberen PHP-Code schreiben

Mit zu­neh­men­der Größe eines Projektes steigt auch die Bedeutung von gut struk­tu­rier­tem und sauber ge­schrie­be­nem Code. Sauberer PHP-Code ist leichter zu lesen, einfacher zu warten und weniger feh­ler­an­fäl­lig. PHP-An­wen­dun­gen folgen deshalb be­stimm­ten Kon­ven­tio­nen und nutzen Werkzeuge, die Ordnung, Übersicht und Si­cher­heit fördern.

Composer und PSR-4 (au­to­ma­ti­sches Laden von Klassen)

Composer ist ein zentrales Werkzeug in der PHP-Ent­wick­lung. Es dient dazu, externe Bi­blio­the­ken zu verwalten und PHP-Klassen au­to­ma­tisch zu laden. Ohne Composer müssten Klassen mit require oder include manuell ein­ge­bun­den werden, was bei größeren Projekten schnell un­über­sicht­lich wird. Composer nutzt in der Regel den Autoload-Standard PSR-4. Dieser Standard legt fest, wie Klassen anhand ihres Namens und ihres Spei­cher­orts gefunden werden. Der Name einer Klasse ent­spricht dabei der Ord­ner­struk­tur, in der sie ge­spei­chert ist.

Ein einfaches Beispiel ver­deut­licht dieses Prinzip. Befindet sich eine Klasse User im Namespace App\Model, liegt die ent­spre­chen­de Datei in einem Ordner „src/Model“:

<?php
namespace App\Model;
class User {
public function getName() {
return "Max Mustermann";
}
}
php

Dank PSR-4 kann diese Klasse an jeder Stelle im Projekt verwendet werden, ohne die Datei manuell ein­zu­bin­den. PHP lädt sie au­to­ma­tisch, sobald sie benötigt wird. Das macht den Code über­sicht­li­cher und reduziert Feh­ler­quel­len.

Name­spaces für klare Trennung von Code

Name­spaces helfen dabei, Klassen logisch zu grup­pie­ren und Na­mens­kon­flik­te zu vermeiden. In kleinen Skripten ist es pro­blem­los möglich, Klassen einfach User oder Database zu nennen. In größeren An­wen­dun­gen kann es jedoch vorkommen, dass mehrere Klassen denselben Namen tragen, aber un­ter­schied­li­che Aufgaben erfüllen. Durch Name­spaces lassen sich diese Klassen eindeutig von­ein­an­der trennen. So kann es bei­spiels­wei­se eine Klasse User für die Datenbank und eine weitere Klasse User für die Dar­stel­lung im Frontend geben, ohne dass es zu Kon­flik­ten kommt.

Folgendes Beispiel zeigt die Ver­wen­dung eines Name­spaces:

<?php
namespace App\Service;
class Mailer {
public function send() {
echo "E-Mail wurde versendet.";
}
}
php

Beim Einsatz der Klasse wird der voll­stän­di­ge Name inklusive Namespace verwendet oder per use ein­ge­bun­den. Dadurch bleibt der Code eindeutig und gut struk­tu­riert.

Pro­jekt­struk­tur: .env-Dateien und .gitignore

Eine klare Pro­jekt­struk­tur ist ein wichtiger Be­stand­teil sauberen PHP-Codes. PHP-Projekte trennen den ei­gent­li­chen Pro­gramm­code von öf­fent­lich er­reich­ba­ren Dateien und Kon­fi­gu­ra­ti­ons­da­ten. Häufig liegt der PHP-Code in einem eigenen Ordner, während der Webserver nur auf ein öf­fent­li­ches Ver­zeich­nis zugreifen darf.

Kon­fi­gu­ra­ti­ons­wer­te wie Datenbank-Zu­gangs­da­ten oder API-Schlüssel werden meist nicht direkt im Code ge­spei­chert. Statt­des­sen nutzt man so­ge­nann­te .env-Dateien, in denen solche Werte zentral abgelegt werden. Das erhöht die Si­cher­heit und er­leich­tert den Wechsel zwischen Ent­wick­lungs- und Pro­duk­tiv­um­ge­bung.

Ein einfaches Beispiel für eine .env-Datei könnte so aussehen:

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=secret
txt

Diese Datei wird bewusst nicht in der Ver­si­ons­ver­wal­tung ge­spei­chert. Dafür sorgt die .gitignore-Datei, die festlegt, welche Dateien oder Ordner von Git ignoriert werden sollen. In der .gitignore wird die .env-Datei explizit aus­ge­schlos­sen, damit sensible Daten nicht ver­se­hent­lich ver­öf­fent­licht werden.

Feh­ler­be­hand­lung und Logging

Der Umgang mit Fehlern un­ter­schei­det sich zwischen Ent­wick­lungs- und Pro­duk­tiv­um­ge­bung. Während der Ent­wick­lung ist es sinnvoll, PHP-Feh­ler­mel­dun­gen direkt an­zu­zei­gen. Dadurch lassen sich Probleme schnell erkennen und beheben.

In pro­duk­ti­ven An­wen­dun­gen sollten Feh­ler­mel­dun­gen hingegen nicht sichtbar sein, da sie interne In­for­ma­tio­nen preis­ge­ben könnten. Statt­des­sen werden Fehler in Log­da­tei­en ge­schrie­ben, die nur für Ent­wick­le­rin­nen und Ent­wick­ler zu­gäng­lich sind.

In einer Ent­wick­lungs­um­ge­bung kann die Feh­ler­aus­ga­be bei­spiels­wei­se so aktiviert werden:

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
php

In einer pro­duk­ti­ven Umgebung wird die Anzeige von Fehlern de­ak­ti­viert und das Logging aktiviert. PHP schreibt auf­tre­ten­de Fehler dann in eine Logdatei, ohne diese den Be­su­che­rin­nen und Besuchern der Webseite an­zu­zei­gen. So bleibt die Anwendung stabil und sicher, während Fehler dennoch nach­voll­zieh­bar do­ku­men­tiert werden.

Datenbank-Basics mit PHP: Ein einfaches PDO-Beispiel

Um Daten mit PHP zu speichern oder aus­zu­le­sen, benötigt man eine Datenbank. In diesem Beispiel verwenden wir MySQL, das stan­dard­mä­ßig in XAMPP enthalten ist. PHP kann über PDO, also PHP Data Objects, sicher mit der Datenbank kom­mu­ni­zie­ren. PDO stellt sicher, dass Befehle korrekt aus­ge­führt werden und dass Be­nut­zer­ein­ga­ben keine Si­cher­heits­lü­cken ver­ur­sa­chen.

Datenbank und Tabelle erstellen

Zuerst erstellen wir in phpMy­Ad­min eine neue Datenbank mit dem Namen testdb. Innerhalb dieser Datenbank legen wir eine Tabelle namens users an. Diese Tabelle enthält drei Spalten: id für die ein­deu­ti­ge Iden­ti­fi­ka­ti­on jedes Benutzers, username für den Be­nut­zer­na­men und email für die E-Mail-Adresse. In SQL sieht das so aus:

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
sql

Da­ten­bank­ope­ra­tio­nen in PHP

Jetzt erstellen wir eine Datei „crud.php“ im XAMPP-Ordner „htdocs“. Wir stellen in diesem Beispiel eine Ver­bin­dung zur Datenbank her zeigen zunächst die grund­le­gen­den Ope­ra­tio­nen CREATE, READ, UPDATE und DELETE (CRUD):

<?php
// Verbindung zur Datenbank herstellen
$host = '127.0.0.1';
$db = 'testdb';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Fehler sichtbar machen
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Daten als Array
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
echo "Verbindung fehlgeschlagen: " . $e->getMessage();
exit;
}
// CREATE: neuen User einfügen
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
$stmt->execute([
'username' => 'Max Mustermann',
'email' => 'max@example.com'
]);
// READ: alle User auslesen
$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll();
// Ausgabe der Benutzerliste
echo "<h2>Benutzerliste</h2>";
foreach ($users as $user) {
echo "ID: " . $user['id'] . " – Name: " . htmlspecialchars($user['username']) . " – E-Mail: " . htmlspecialchars($user['email']) . "<br>";
}
// UPDATE: E-Mail eines Users ändern
$stmt = $pdo->prepare("UPDATE users SET email = :email WHERE username = :username");
$stmt->execute([
'email' => 'max.mustermann@example.com',
'username' => 'Max Mustermann'
]);
echo "<p>Die E-Mail-Adresse von Max Mustermann wurde aktualisiert.</p>";
// DELETE: User löschen
$stmt = $pdo->prepare("DELETE FROM users WHERE username = :username");
$stmt->execute([
    'username' => 'Max Mustermann'
]);
?>
php

Zuerst wird mit PDO eine Ver­bin­dung zur Datenbank aufgebaut. Wir geben dazu Host, Da­ten­bank­na­me, Be­nut­zer­na­me, Passwort und Zei­chen­satz an. PDO sorgt dafür, dass SQL-Befehle sicher aus­ge­führt werden und Fehler sichtbar werden.

An­schlie­ßend zeigen wir die vier grund­le­gen­den Ope­ra­tio­nen:

  • CREATE (Einfügen von Daten): Mit INSERT INTO fügen wir einen neuen User ein. Die Platz­hal­ter :username und :email sorgen dafür, dass Be­nut­zer­ein­ga­ben sicher ver­ar­bei­tet werden.
  • READ (Daten auslesen): Mit SELECT * FROM users holen wir alle vor­han­de­nen Da­ten­sät­ze. Mit fetchAll() speichern wir die Er­geb­nis­se in einem Array und geben sie in einer über­sicht­li­chen Liste aus.
  • UPDATE (Daten ändern): Mit UPDATE können wir die E-Mail-Adresse eines Users ändern. Wir verwenden wieder Platz­hal­ter, um die Werte sicher ein­zu­set­zen.
  • DELETE (Daten löschen): Mit DELETE FROM users WHERE username = :username entfernen wir einen be­stimm­ten User aus der Datenbank. Der Platz­hal­ter :username sorgt dafür, dass die Eingabe sicher ver­ar­bei­tet wird, ohne dass ein Angreifer die Datenbank ma­ni­pu­lie­ren kann. So können wir gezielt einzelne Da­ten­sät­ze löschen, ohne die ganze Tabelle zu be­ein­flus­sen.

Sichere Be­nut­zer­ein­ga­ben und Da­ten­ver­ar­bei­tung

Sobald PHP mit Be­nut­zer­ein­ga­ben arbeitet, entsteht ein Si­cher­heits­ri­si­ko. Be­su­che­rin­nen und Besucher können For­mu­lar­fel­der ma­ni­pu­lie­ren, un­er­war­te­te Daten senden oder gezielt versuchen, eine Anwendung zu miss­brau­chen. Deshalb stellt PHP ver­schie­de­ne Funk­tio­nen bereit, mit denen Eingaben geprüft, ver­ar­bei­tet und sicher ge­spei­chert werden können.

Daten sicher in Da­ten­ban­ken speichern: Prepared State­ments

Eine der häu­figs­ten Si­cher­heits­lü­cken in PHP-An­wen­dun­gen entsteht bei der Arbeit mit Da­ten­ban­ken. Werden Be­nut­zer­ein­ga­ben direkt in SQL-Abfragen eingebaut, kann eine so­ge­nann­te SQL-Injection auftreten. Dabei schleusen An­grei­fe­rin­nen und Angreifer eigenen SQL-Code ein.

Prepared State­ments ver­hin­dern dieses Problem, indem SQL-Code und Be­nut­zer­da­ten strikt von­ein­an­der getrennt werden. PHP stellt dafür die Da­ten­bank­schnitt­stel­le PDO zur Verfügung.

<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute([
'username' => $username
]);
php

Der Code bereitet eine Da­ten­bank­ab­fra­ge vor, mit der alle Nutzenden aus der Tabelle users gesucht werden, deren Be­nut­zer­na­me einem be­stimm­ten Wert ent­spricht. Statt den Be­nut­zer­na­men direkt in den SQL-Befehl zu schreiben, wird der Platz­hal­ter :username verwendet, der erst beim Ausführen der Abfrage mit einem konkreten Wert gefüllt wird. Dadurch trennt PHP den SQL-Code von den Be­nut­zer­da­ten und ver­hin­dert, dass Eingaben den Befehl ma­ni­pu­lie­ren können.

Ausgaben absichern: Output-Escaping

Nicht nur das Speichern von Daten, sondern auch deren Ausgabe kann ge­fähr­lich sein. Gibt man Be­nut­zer­ein­ga­ben un­ge­fil­tert im Browser aus, kann so­ge­nann­tes Cross-Site-Scripting (XSS) auftreten. Dabei wird schäd­li­cher Code im Browser anderer Nut­ze­rin­nen und Nutzer aus­ge­führt. Um das zu ver­hin­dern, werden Ausgaben maskiert. In PHP geschieht dies meist mit der Funktion htmlspecialchars() und der Text wird angezeigt, aber nicht als Code in­ter­pre­tiert.

<?php
echo htmlspecialchars("<h1>Hello World!</h1>", ENT_QUOTES, 'UTF-8');
php
Bild: PHP-Funktion htmlspecialchars()
Wenn Sie html­spe­cial­chars() nutzen, wird HTML-Code als einfacher String in­ter­pre­tiert.

Be­nut­zer­ein­ga­ben filtern: filter_input()

PHP bietet mit filter_input() eine Mög­lich­keit, Be­nut­zer­ein­ga­ben bereits beim Einlesen zu prüfen und zu be­rei­ni­gen. So lassen sich ungültige oder un­er­wünsch­te Werte früh­zei­tig erkennen.Ein einfaches Beispiel ist das Einlesen einer E-Mail-Adresse:

<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
php

Ist die Eingabe keine gültige E-Mail-Adresse, liefert die Funktion false zurück. Auf diese Weise kann der Code gezielt reagieren, bevor mit den Daten wei­ter­ge­ar­bei­tet wird.

Pass­wör­ter sicher speichern mit password_hash()

Pass­wör­ter dürfen niemals im Klartext ge­spei­chert werden. Selbst eine einfache Ver­schlüs­se­lung ist nicht aus­rei­chend. PHP stellt dafür die Funktion password_hash() bereit, die Pass­wör­ter sicher hasht.

<?php
$hash = password_hash($password, PASSWORD_DEFAULT);
php

Beim späteren Login wird das ein­ge­ge­be­ne Passwort mit password_verify() überprüft:

<?php
if (password_verify($password, $hash)) {
echo "Login erfolgreich";
}
php

Der ei­gent­li­che Pass­wort­wert ist dabei nie wieder sichtbar. Selbst bei einem Da­ten­bankleck bleiben die Pass­wör­ter geschützt.

Schutz vor For­mu­lar­ma­ni­pu­la­ti­on: CSRF-Tokens

Bei For­mu­la­ren besteht die Gefahr, dass sie ohne Wissen der Nut­ze­rin­nen und Nutzer ab­ge­schickt werden. Um dies zu ver­hin­dern, werden so­ge­nann­te CSRF-Tokens ein­ge­setzt. Dabei handelt es sich um zufällige Zei­chen­fol­gen, die bei jedem For­mu­lar­auf­ruf neu erzeugt werden.

<?php
$_SESSION['token'] = bin2hex(random_bytes(32));
php

Diese Zeile erzeugt einen zu­fäl­li­gen, schwer er­rat­ba­ren Si­cher­heits­code und speichert ihn in der aktuellen Sitzung des Users. Die Funktion random_bytes(32) erstellt 32 zufällige Bytes, also Rohdaten, die nicht direkt lesbar sind. Mit bin2hex() werden diese Rohdaten in eine gut lesbare Zei­chen­fol­ge aus Buch­sta­ben und Zahlen um­ge­wan­delt. Der erzeugte Wert wird in $_SESSION['token'] ge­spei­chert und später verwendet, um zu prüfen, ob ein Formular wirklich von derselben Sitzung stammt.

Datei-Uploads mit Va­li­die­rung

Auch Datei-Uploads sind besonders sensible und können Si­cher­heits­ri­si­ken ein­brin­gen, da hier fremde Dateien auf den Server gelangen. Deshalb sollten Dateityp und Da­tei­grö­ße immer geprüft werden.

Ein einfaches Beispiel für eine Da­tei­grö­ßen­prü­fung könnte so aussehen:

<?php
if ($_FILES['upload']['size'] > 1000000) {
echo "Datei ist zu groß.";
}
php

Der Code prüft, wie groß die hoch­ge­la­de­ne Datei ist, und ver­gleicht sie mit einem fest­ge­leg­ten Ma­xi­mal­wert von 1.000.000 Bytes. Ist die Datei größer als erlaubt, wird eine Feh­ler­mel­dung aus­ge­ge­ben und der Upload kann abgelehnt werden. So wird ver­hin­dert, dass zu große Dateien auf den Server geladen werden. Zu­sätz­lich sollte geprüft werden, ob es sich wirklich um den er­war­te­ten Dateityp handelt, etwa ein Bild. Dateien sollten niemals ungeprüft aus­führ­bar auf dem Server abgelegt werden.

Zum Hauptmenü