PHP/Tutorials/Einstieg/Grundlagen

Aus SELFHTML-Wiki
< PHP‎ | Tutorials‎ | Einstieg
Wechseln zu: Navigation, Suche

Informationen zu diesem Text

Lesedauer
20min
Schwierigkeitsgrad
einfach
Vorausgesetztes Wissen
Grundkenntnisse in
● HTML

Aufbau von PHP-Code[Bearbeiten]

Wie schon im vorherigen Kapitel erwähnt, wird PHP-Code mit <?php eingeleitet und mit ?> abgeschlossen. Dabei ist wichtig, dass hinter <?php ein Leerraum steht (Leerzeichen, Tabulator oder Zeilenumbruch), andernfalls wird das open-tag nicht erkannt.

Bei PHP Dateien, die mit PHP-Programmcode enden, ist es üblich, das abschließende ?> wegzulassen. Grund dafür ist, dass man schnell einige Leerstellen hinter dem ?> übersieht, und PHP würde diese Leerstellen dann in die Ausgabe schreiben. Gerade bei PHP-Dateien, die ausschließlich Programmcode enthalten, ist das unerwünscht.

Die so genannte PHP Framework Interop Group hat einige Standards formuliert, nach denen sich ein PHP Programmierer richten soll. Ob Sie das tun wollen, bleibt natürlich Ihnen überlassen. Ein wichtiger Teil des Basis-Standards PSR-1 ist, dass PHP Dateien als Unicode mit UTF-8 Encoding und ohne ein einleitendes Byte Order Mark (BOM) gespeichert werden sollen. Wenn Sie das tun, ersparen Sie sich einige Mühe beim Arbeiten mit Zeichen, die nicht im klassischen ASCII-Zeichensatz liegen. Vielen ältere PHP Programme sind in einem Codepage-Format (z.B. Windows Latin-1 oder ISO-8859-1) gespeichert, setzen aber in der HTTP Response einen Content-Type Header, der ein anderes charset angibt. Solche Programme sind dann voll von unlesbaren Texten, in denen mit viel Mühe Umlaute und ß als HTML-Symbole notiert werden, oder produzieren da, wo das vergessen wurde, kaputte Textausgaben im Browser.

Beispiel: Umständliche Notation bei unpassender Codierung
<p>Wir begr&uuml;&sz;en Sie auf unseren Seiten &#x1F600</p>
Ist Ihre PHP-Datei als UTF-8 gespeichert, können Sie es schöner schreiben:
<p>Wir begrüßen Sie auf unseren Seiten 😊</p>

Befehlsformat[Bearbeiten]

Der in <?php ?> eigebettete Teil eines HTML Dokuments bildet ein PHP-Programm, das sich aus eine Folge von PHP-Befehlen (engl. Statements) zusammensetzt. Diese Befehle müssen durch ein Semikolon voneinander getrennt werden, weil es sonst zu Mehrdeutigkeiten bei der Interpretation kommen kann.

Vor dem PHP close tag ?> nimmt PHP automatisch ein Semikolon an, darum müssen Sie dort keins notieren. Sie können es aber trotzdem tun.

Ein PHP Befehl kann ein Steuerbefehl sein, der durch ein Befehlswort eingeleitet wird, oder einfach nur aus einem so genannten Ausdruck (engl. Expression) bestehen. Ein Ausdruck ist vergleichbar mit einer mathematischen Formel, die einen Wert ermittelt - aber er kann um Unterschied zur Mathematik auch Aktivitäten auslösen, die über eine Wertermittlung hinaus gehen. Ausdrücke werden in einem eigenen Abschnitt behandelt.

Ausgabe[Bearbeiten]

Typische PHP-Skripte verarbeiten Daten (aus Datenbanken oder Formularen), um sie dann auf einer Webseite auszugeben. Dafür können Sie sowohl echo() oder print() verwenden:

Beispiel: HTML-Code mit kleinen PHP-Ergänzungen
<p>Seite abgerufen am 
  <?php
    echo date('d.m.Y \u\m H:i:s');
  ?> 
  Uhr</p>

Sowohl echo als auch print sind Sprachkonstrukte und keine echten Funktionen. Der Unterschied ist, dass print nur einen Wert ausgeben kann, dafür aber einen Wert zurückliefert (die Zahl 1). Es lässt sich also in einen arithmetischen Ausdruck einbauen.

Kommentare[Bearbeiten]

Aufgabe von Kommentaren ist es, in einem Programmtext Dokumentation einzufügen, so dass ein späterer Leser weiß, weshalb bestimmte Dinge getan wurden. PHP basiert wie JavaScript auf C und hat deshalb ein ähnliches Format Kommentare:

Beispiel: HTML-Code mit kleinen PHP-Ergänzungen
<p>Seite abgerufen am 
  <?php
    // Datumsausgabe
    echo date('d.m.Y \u\m H:i:s');
  ?> 
  Uhr</p>
  • einzeilig: alles was hinter // steht, wird nicht ausgeführt
  • einzeilig: alles was hinter # steht, wird nicht ausgeführt
  • mehrzeilig: alles zwischen /* und */ steht, wird nicht ausgeführt

Man muss daher aufpassen, wenn Kommentare verschachtelt oder unterschiedliche Stile verwendet werden.

Beachten Sie: Die einzeiligen Kommentare kommentieren alles bis zum Zeilenende oder bis zum Ende des aktuellen PHP-Blocks aus, je nachdem, was zuerst eintritt. Sie haben also ggf. keinen Einfluss auf HTML-Code, der nach einem einzeiligen Kommentar mit diesem in einer Zeile steht.

Bedenken Sie: beim Leser Ihrer Kommentare handelt es sich sehr wahrscheinlich um Ihr einige Monate oder Jahre älteres Selbst, das sich fragt, was Ihnen denn damals beim Programmieren durch den Kopf gegangen sein mag. Zweifel am eigenen Verstand sind dann nicht selten.

Empfehlung: Erläutern Sie Ihren Code durch sinnvolle Kommentare, um Ihnen und anderen später zu erleichtern, die Gedankengänge nachzuvollziehen. Es ist nicht notwendig, offensichtliche Dinge wie "Speichere 7 in der Variablen $x" oder "Addiere die Variablen $i und $j". Wenn die Zahl 7 aber eine spezielle Bedeutung hat, sollte die Bedeutung im Kommentar stehen. Wenn der Grund, warum $i und $j addiert werden, nicht offensichtlich ist, sollten Sie vor Einfügen eines Kommentars überlegen, ob die Variablen sprechend genug benannt wurden. Eine gut gewählter Name erspart viele Kommentare.

Werte und Datentypen[Bearbeiten]

Die Statements eines PHP-Programms beschäftigen sich damit, Daten zu lesen, zu schreiben oder umzuformen. Die einzelnen Elemente der von Ihnen verarbeiten Daten bestehen aus Werten, die unterschiedliche Charakteristika aufweisen können. Anhand dieser Charakteristika gliedert man die verwendeten Werte in Typen.

Solche Werte können direkt im Programm aufgeschrieben sein, dann spricht man von Literalen. Oder sie sind von irgendwo eingelesen oder berechnet worden und im Speicher abgelegt worden, dann spricht man vom Inhalt einer Variablen.

Einfache Typen und ihre Literale[Bearbeiten]

PHP kennt vier einfache Wertetypen:

boolean
beschreibt einen logischen Zustand und kann die Werte true (ja, wahr, richtig) und false (nein, falsch) annehmen. Die Worte true und false sind in PHP reservierte Begriffe für die beiden Literale des boolean-Typs, und können nach Belieben groß oder klein geschrieben werden.
integer
Zahlen ohne Nachkommastellen. Der mögliche Bereich von integer-Zahlen ist unterschiedlich und hängt von der Plattform ab, auf der Sie PHP einsetzen, aber der Bereich -2147483648 bis 2147483647 ist üblich. Sie schreiben eine Integer-Literal einfach als Ziffernfolge, und stellen bei negativen Zahlen ein Minuszeichen voran.
Außer im üblichen Dezimalsystem können Sie Integer-Literale in PHP auch im Zweiersystem (Binär), Achtersystem (Oktal) und Sechzehnersystem (Hexadezimal) notieren. Dazu erhalten die Ziffern der Zahl ein entsprechendes Präfix:
  • Binär: Ein Binär-Literal beginnt mit 0b oder 0B und besteht aus den Ziffern 0 und 1. Beispiel: 0b10110010, dezimaler Wert ist 178.
  • Hexadezimal: Ein Hexadezimal-Literal beginnt mit 0x oder 0X und besteht aus den Ziffern 0-9 und A-F für die Stellenwerte 10-15. Beispiel: 0xB2, dezimaler Wert ist 178.
  • Oktal: Ein Oktal-Literal beginnt mit 0 und besteht aus den Ziffern 0-7. Wenn Sie ein Integer-Literal versehentlich mit führender 0 notieren, interpretiert PHP das als Oktalzahl und gestattet nur die Ziffern 0-7. Beispiel: 0262, dezimaler Wert ist 178. Eine Angabe wie 09 führt zu der Meldung, dass ein ungültiges Literal verwendet würde.
Sie sollten Oktalzahlen vermeiden. Die verwirrende Kennzeichnung nur durch eine führende Null ist ein Erbe aus der Zeit, wo das 36-bit System PDP-10 der Firma DEC der Traum aller Hacker war, und alles noch etwas größer war. Auch ein Byte: auf der PDP-10 hatte es 9 Bits. 9 Bits lassen sich gut als dreistellige Oktalzahl schreiben (weil eine Oktalziffer 3 Bits entspricht). Auf Unix-Systemen werden Rechte für Dateien durch Gruppen aus 3 Bits gekennzeichnet und ebenfalls oktal notiert. So fand die Oktalschreibweise Eingang in die Sprache C, und darüber in PHP. Und man kann es nicht abschalten.
float
Zahlen mit Nachkommastellen. Float-Zahlen werden in einem speziellen Format (IEEE 754 double) gespeichert, das eine Menge von ca. 14 signifikanten Ziffern bietet. Sie kennen das vielleicht von einem wissenschaftlichen Taschenrechner: Wenn die Stellenzahl nicht ausreicht, zeigt er Ihnen statt 123456789 vielleicht 1.23456 E08 an, was 1.23456 10-hoch-8 darstellen soll. Float-Werte können sich im Bereich Exponent -1.8e308 bis +1.8e308 bewegen.
string
Eine Folge von Zeichen. Die Länge eines Strings kann 0 sein, und auf 32-bit PHP Systemen bis zu 2GiB betragen. Auf 64-bit PHP System ist die Länge nur durch den verfügbaren Speicher begrenzt (bzw muss kleiner als 2^63 sein). PHP setzt in Strings Zeichen und Bytes gleich, es existiert keine native Unicode-Unterstützung. Statt dessen existieren zwei Gruppen von Funktionen, die mit Strings umgehen können. Eine Gruppe setzt Zeichen und Bytes gleich, die andere (mit mb_ vor dem Funktionsnamen) beachtet die Regeln der UTF-8 Codierung.
Es gibt vier Möglichkeiten, ein String-Literal zu notieren:
einfache Anführungszeichen
'Hallo Welt'
Ein String-Literal in einfachen Anführungszeichen wird von PHP nicht weiter interpretiert. Es gibt nur zwei Ausnahmen: Will man in einem solchen Literal einen Backslash \ oder ein einfaches Anführungszeichen schreiben, so muss statt dessen \\ bzw. \' notiert werden.
doppelte Anführungszeichen
"Hallo $welt"
String-Literale in doppelten Anführungszeichen werden weiter gehend interpretiert. Zum einen sind mehr Backslash-Sequenzen möglich (was Sie hier nachschauen können), zum anderen erkennt PHP in solchen Literalen Variablen und ersetzt sie durch den darin gespeicherten Wert. Das Verständnis dieser string parsing genannten Technik setzt Kenntnisse über Variablen voraus.
heredoc
String-Literale im heredoc Format bieten die Möglichkeit, einen String über mehrere Zeilen zu verteilen. Die Zeilenumbrüche sind Teil des Strings. Auch in heredoc-Literalen findet string parsing statt. Ein heredoc-String beginnt mit der Zeichenfolge <<< und einem Ende-Symbol. Dieses Symbol stellt einen beliebigen, in PHP gültigen Namen dar (siehe Variablen). Nach dem Endesymbol muss unmittelbar, ohne Leerstellen, ein Zeilenumbruch folgen. Dieser Zeilenumbruch ist nicht Teil des Strings. Das Ende eines heredoc-Strings folgt restriktiven Regeln: Ein Zeilenwechsel, das Ende-Symbol, ein Semikolon und ein weiterer Zeilenwechsel. Innerhalb dieser Folge darf sich kein Leerzeichen befinden, andernfalls weist PHP das Literal als fehlerhaft ab. Das klingt komplizierter als es ist. Schauen Sie auf dieses
Beispiel: String-Literal im heredoc-Format
<?php
   $id = 4711;
   echo <<<END
SELECT name, vorname, plz, ort
FROM   personen
WHERE  id=$id
   AND gueltig=1
END;
?>
Damit würde dieses SQL Statement erzeugt:
SELECT name, vorname, plz, ort
FROM   personen
WHERE  id=4711
   AND gueltig=1
Beachten Sie bitte, dass die verwendete ID in diesem Beispiel als integer-Literal notiert wurde und damit keiner Prüfung bedarf. Ein Wert, der in ein SQL Statement eingesetzt wird, muss normalerweise vorbehandelt werden, um zu verhindern, dass eine böswillig konstruierte Werteübergabe das SQL-Statement umfunktioniert.
Um ein heredoc-Literal klar von einem nowdoc-Literal abgrenzen zu können, ist es ab PHP 5.3 erlaubt, das Endesymbol in der Startzeile des Literals in doppelte Anführungszeichen zu setzen.
nowdoc
String-Literale in nowdoc-Form sind mit PHP 5.3 hinzugekommen. Sie sehen ähnlich aus wie heredoc-Literale, mit dem Unterschied, dass das Ende-Symbol in der Startzeile in einfache Anführungszeichen gesetzt ist. Der Unterschied ist, dass in einem nowdoc-Literal keinerlei Verarbeitung stattfindet. Selbst \ und ' haben - im Gegensatz zu Strings in einfachen Anführungszeichen, keine Sonderbedeutung. Das Ende-Symbol in der Schlusszeile steht ohne Anführungszeichen.
Beispiel: String-Literal im nowdoc-Format
<?php
   $id = 4711;
   echo <<<'END'
Beispiel für einen echo-Befehl mit String-Parsing:
<?php
   $w = "Welt";
   echo "Hallo $w.";
?>
END;
?>
Der Inhalt des nowdoc-Literals wird unverändert ausgegeben. Selbst die Start- und Ende-Tags für PHP werden nicht beachtet:
Beispiel für einen echo-Befehl mit String-Parsing:
<?php
   $w = "Welt";
   echo "Hallo $w.";
?>

String Parsing[Bearbeiten]

String Parsing (von engl. to parse - zergliedern, analysieren) bedeutet, innerhalb eines Strings bestimmte Zeichenfolgen zu erkennen und besonders zu behandeln. Es wird von PHP in String-Literalen mit doppelten Anführungszeichen und in heredoc-Literalen durchgeführt. Bei Auffinden eines Dollarzeichens wird versucht, den dahinter stehenden Text als Variablenzugriff zu interpretieren. PHP sammelt dazu alle Zeichen, die als Variablenname gültig sind, ruft den Inhalt der Variablen dieses Namens ab und ersetzt den Variablennamen im String-Literal durch den Variableninhalt. Einige Beispiele dafür haben Sie weiter oben schon gesehen.

Außer einfachen Variablenzugriffen sind auf diese Weise auch Zugriffe auf Array mit einem Index möglich, sowie Zugriffe auf eine Eigenschaft eines Objekts. Wird das Array assoziativ eingesetzt, darf der verwendete Key nicht in Anführungszeichen gesetzt werden.

Beispiel: String Parsing, einfache Syntax
<?
$welt = "Erde";
$arr = ARRAY(1,2,3);
$p = new Person();
$p->Name = "Hugo";

echo "Hallo $welt Nr. $arr[1], ich suche $p->Name";
?></source}}
{{BeispielText|Ausgabe: Hallo Erde Nr. 2, ich suche Hugo}}}}

Komplexere Zugriffe sind durch Hinzufügen von geschweiften Klammern möglich.

{{Beispiel|titel=String Parsing, komplexe Syntax|
{{BeispielCode|<source lang="php"><?
$arr = ARRAY(1, ARRAY(47,11), 3);
$p = new Person();
$p->Anschrift = new StrassenAdresse();
$p->Anschrift->PLZ = '10000';

echo "An Arrayposition 1,0 steht {$arr[1][0]}. Die PLZ lautet {$p->Anschrift->PLZ}";
?>
Ausgabe: An Arrayposition 1,0 steht 47. Die PLZ lautet 10000

Weitere Beispiele und mehr Details finden Sie im php.net Kapitel strings unter Variable Parsing.

Zusammengesetzte Typen[Bearbeiten]

Aus den vier Grundtypen lassen sich komplexere Typen auf verschiedene Arten zusammensetzen. Die Details dieser zusammengesetzten Typen sollen später erläutert werden. Es handelt sich um Arrays, Objekte, sowie die Pseudotypen callable und iterable

Spezielle Typen[Bearbeiten]

NULL
Der Wert NULL ist ein eigener Typ, für den es genau einen Wert gibt. Er findet Verwendung für Variablen, denen noch kein Wert zugewiesen wurde oder die mit unset() gelöscht wurden. Das PHP Schlüsselwort NULL stellt ein Literal für diesen Wert dar.
resource
Ressourcen werden von etlichen Funktionen bereitgestellt, die sich um die Kommunikation mit externen Systemen kümmern, z.B. Zugriffe auf Dateien oder Datenbanken. Es gibt keine Literale für Ressourcen, und Sie können auch nichts mit ihnen machen, außer sie an andere Funktionen zu übergeben, die Ressourcen dieser Art erwarten.

Spezielle Schreibweisen aus dem PHP Handbuch[Bearbeiten]

Im PHP Handbuch werden bei der Beschreibung von Funktionen und ihren Rückgabewerten gelegentlich noch folgende Bezeichnungen benutzt:

mixed
Gibt an, dass hier unterschiedliche Typen möglich sind. Die Funktion kann sich, je nach übergebenem Typ, unterschiedlich verhalten.
number
Die Funktion akzeptiert Integer- und Float-Werte
callback
Wenn im PHP Handbuch angegeben ist, dass eine Funktion einen Wert vom Typ callback erwartet, ist das Handbuch noch nicht umgestellt. callback ist synonym zu callable
array|object
Der senkrechte Strich steht in C-artigen Sprachen für ein logisches Oder. D.h. die Funktion erwartet hier entweder ein Array oder ein Objekt
void
Die Angabe void ist nur als Rückgabetyp einer Funktion möglich und bedeutet: Nichts. Diese Funktion gibt keinen Wert zurück.

Variablen[Bearbeiten]

Einführung[Bearbeiten]

Die im vorigen Abschnitt beschriebenen Werte mit ihren verschiedenen Typen wären wenig nützlich, wenn man sie nicht zur späteren Verwendung speichern könnte. Wo im Speicher ein Wert abgelegt wird, darum müssen Sie sich nicht kümmern, das macht PHP. Sie müssen sich lediglich einen Namen überlegen, unter dem Sie einen Wert ablegen wollen. Ein solcher Name zusammen mit dem dazu gespeicherten Wert wird als Variable bezeichnet. Dieser Wert ist jederzeit veränderbar, daher die Bezeichnung.

Um zu kennzeichnen, dass ein Name eine Variable bezeichnen soll, muss ihm, anders als in JavaScript, ein Dollarzeichen ($) vorangestellt werden. Der Name selbst darf laut PHP Handbuch aus „Buchstaben“, Ziffern und dem Unterstrich-Zeichen _ bestehen. Nur an der ersten Stelle des Namens sind Ziffern nicht erlaubt.

Diese Einschränkungen sind nicht unbedingt logisch. Warum also keine Ziffern an erster Stelle? Eine Verwechslungsgefahr mit Zahlen besteht durch das Dollarzeichen nicht. Warum überhaupt ein Dollarzeichen, andere Sprachen brauchen das doch auch nicht. Dass ein Name nicht mit Ziffern beginnt, ist in jeder Programmiersprache so, die PHP-Autoren dürften dieser Konvention einfach gefolgt sein. Ein spezielles Zeichen zum Markieren von Variablen macht ihre Erkennung im Programmcode leichter, und als Rasmus Lerdorf 1994 seine ersten PHP (Personal Home Page) Tools schrieb, hat er vermutlich mehr Wert auf die Einfachheit des Interpreters als auf die Einfachheit der Sprache gelegt.

Ein Buchstabe ist nach PHP-Definition ein Zeichen von a-z und A-Z, sowie jedes Zeichen mit einem Zeichencode ab \x7F. Im PHP Handbuch ist angegeben, dass es sich um die Zeichen von \x7F bis \xFF handelt, wenn man den PHP Quellcode aber als Unicode speichert, ist jedes Unicodezeichen möglich. Wenn Ihr Editor mitspielt, können Sie eine Variable $😊 verwenden, sogar Zeichen, die für Leerraum stehen (\xa0 oder der Unicodebereich \u2000 bis \u200f). Sie sollten diese Möglichkeit aber nicht nutzen.

Empfehlung: Verwenden Sie sprechende Namen, bei denen Sie auch nach mehreren Monaten noch wissen, worum es geht.
Verzichten Sie auf den Einsatz von Sonderzeichen und Umlauten. Auch wenn der Code auf Ihrem Server nicht von anderen eingesehen werden kann, können bei Veröffentlichungen in Foren anderssprachige Programmierer, die keine deutsche Tastatur haben, Ihren Code so nicht oder nur schwer lesen und verändern.

Vermeiden sollten Sie auch Variablennamen, die mit einem Unterstrich-Zeichen beginnen. Sie sind technisch erlaubt, aber PHP behält es sich vor, solche Namen für spezielle Zwecke zu reservieren.

Beachten Sie auch, dass Namen in PHP case-sensitiv sind. $a und $A sind zwei verschiedene Variablen.

Lesbarkeit von längeren Namen ist ein wichtiger Aspekt. Besteht ein Name aus mehreren Teilen, ist eine Abgrenzung dieser Teile oft hilfreich. Für diese Abgrenzung haben sich zwei Stile entwickelt und sind in PHP Programmen zu finden: Unterstriche oder so genannte Binnenmajuskeln (Großbuchstaben im Wort). Beispiele sind Variablennamen wie $zeilenZahl, $ZwischenSumme oder $ausgabe_puffer. Es ist Ihnen überlassen, welchen Stil Sie wählen, es ist nur wichtig, dass Sie bei einem Stil bleiben und nicht ständig wechseln.

Wertzuweisung[Bearbeiten]

Es gibt in PHP keinen besonderen Befehl, um einer Variable einen Wert zuzuweisen. Statt dessen verwendet man die folgende, aus vielen Sprachen vertraute Schreibweise:

Beispiel: Zuweisen eines Strings an eine Variable
<?php
$text = "Mein Text";
echo $text;
?>

Das PHP-Statement $text = "Mein Text"; besitzt kein Befehlswort, es ist lediglich ein Ausdruck, also eine Kombination von Werten und Operatoren. Die Besonderheit ist der Zuweisungsoperator =, der genau wie andere Operatoren einen linken und einen rechten Parameter erwartet. Aber statt sie zu verknüpfen und einen neuen Wert zu liefern, speichert er den Wert auf der rechten Seite in der Variablen auf der linken Seite.

Das Verständnis dieses Vorgangs ist wichtig, denn = ist ein echter binärer Operator, der auch einen Ergebniswert hat - nämlich den zugewiesenen Wert. Genau wie im Ausdruck 2 + 3 + 4 lässt sich auch der Wert des = Operators weiterverwenden, um beispielsweise einen Wert mehreren Variablen zuzuweisen. Der Befehl

<?php
$wert = $text = "Mein Text";
echo $text;
?>

ist vielleicht nicht sonderlich sinnvoll, aber gültig. Zunächst wird das rechte = ausgeführt und speichert das Literal "Mein Text" in der Variablen $text. Der Wert dieser Zuweisung ist der zugewiesene String, und der wird dann in $wert gespeichert.

Außer der Zuweisung sehen Sie im Beispiel auch den Gebrauch einer Variablen. Schreiben Sie den Namen einfach an der Stelle hin, wo Sie sonst das entsprechende Literal notiert hätten.

Variablen, Datentypen und automatische Konvertierungen[Bearbeiten]

Variablen können grundsätzlich jeden Datentyp speichern. Es ist in PHP nicht erforderlich, eine Variable auf einen bestimmten Typ festzulegen. Nacheinander Werte verschiedener Typen in einer Variablen zu speichern ist ebenfalls kein Problem für PHP. Für Sie als Programmautor aber eventuell schon. Denn wenn Sie Werte verarbeiten wollen, die Typen dieser Werten aber nicht zusammen passen, versucht PHP eine automatische Konvertierung. Diese sind aber nicht immer möglich, woraufhin Ihr PHP Programm mit einem Fehler abbrechen kann, oder liefern unerwartete Ergebnisse.

Welche Konvertierung stattfindet, hängt vom Kontext ab. Ein Ausdruck wie "Hallo" + 3 würde die Zahl 3 ergeben (weil der Operator + für die numerische Addition vorgesehen ist und der Versuch, den String "Hallo" in eine Zahl umzuwandeln, beim H abbricht und 0 liefert), dagegen würde "Hallo" . 3 zu "Hallo 3" führen, weil der Punkt-Operator zum Verketten von Strings vorgesehen ist und die Zahl 3 in einen String konvertiert. Der boolesche Wert true wird in eine 1 oder "1" konvertiert, der boolesche Wert false in eine 0 oder zu einem Leerstring.

Die Konvertierung eines beliebigen Wertes in einen logischen (booleschen) Wert ist ähnlich den JavaScript-Regeln. Auch PHP kennt Werte, die „truthy“ und „falsy“ sind. Die folgenden Werte werden in false konvertiert:

  • die Ganzzahl 0
  • der Fließkommawert 0.0
  • der leere String "" und der String "0". Hier unterscheiden sich PHP und JavaScript!
  • ein Array mit 0 Elementen
  • der spezielle Wert NULL, den Variablen haben denen kein Wert zugewiesen wurde
  • SimpleXML Objekte die aus einem leeren XML-Tag erzeugt wurden (SimpleXML ist eine PHP Erweiterung zum Verarbeiten von XML Dokumenten).

Alle anderen Werte gelten als true

Variablen manipulieren[Bearbeiten]

Die in Variablen gespeicherten Werte können jederzeit in Ausdrücken genutzt werden, und das Ergebnis dieser Ausdrücke wieder in Variablen gespeichert werden.

<?php
$vorname = 'Rasmus';
$nachmane = 'Lerdorf';
$name = $vorname . ' ' . $nachname;
echo $name;
?>

Hier werden zwei Variablen der Vor- und Nachname des PHP-Erfinders zugewiesen. Der dritte Befehl enthält einen Zuweisungsausdruck, der der Variablen $name das Ergebnis des rechts vom = Ausdrucksteils zuweist. Dieser rechte Teil besteht aus drei Werten, nämlich der Inhalt von $vorname, das Literal ' ' und der Inhalt von $nachname, die mit dem Operator . verkettet werden und so einen neuen String liefern.

Der rechts von einem Zuweisungsoperator stehende Teilausdruck kann auch die Variable verwenden, der von der Zuweisung ein neuer Wert zugewiesen wird.

<?php
$zaehler = 1;
$zaehler = $zaehler + 1;
?>

Mathematisch gelesen ergibt der zweite Ausdruck keinen Sinn. Der Zuweisungsoperator darf aber nicht mit dem aus der Mathematik bekannten Symbol für Gleichheit verwechselt werden. Die Reihenfolge, in der dieser Ausdruck verarbeitet wird, ist über die Rangfolge der beteiligten Operatoren klar definiert: + hat Vorrang vor = und wird deshalb zuerst ausgeführt. Es entsteht ein neuer Wert, der vom Additionsoperator als Zwischenergebnis bereitgestellt wird und dann vom Zuweisungsoperator in die Variable übertragen wird.

Da Ausdrücke, die einen Zähler erhöhen oder eine Summe bilden sehr häufig sind, gibt es für solche Fälle eine verkürzende Schreibweise. Für die mathematischen Operatoren +, -, *, /, % und **, für den String-Operator . sowie für die logischen Operatoren |, &, ^, << und >> ist die folgende Verkürzung möglich - am Beispiel von + gezeigt:

<?php
$zaehler = $zaehler + 1;   // Langform 
$zaehler += 1;             // Kurzform
?>

Das Erhöhen oder Vermindern eines Wertes um 1 ist so häufig, dass das dafür noch einmal eigene, einstellige Operatoren gibt: ++$a bzw. $a++ erhöhen die Variable $a, --$a bzw. $a-- vermindern sie. Ob man das ++ bzw. -- voran- oder nachstellt, hat Auswirkungen auf den Wert des Operators. Steht die Variable vor dem Operator, erhält man den Wert vor der Operatorausführung. Steht sie hinter dem Operator, wird zuerst der Operator ausgeführt und dann der Wert abgerufen.


Ausgabekontext beachten[Bearbeiten]

Wann immer Sie den Inhalt von Variablen ausgeben, müssen Sie die Regeln des Systems beachten, in dem der Variableninhalt zu stehen kommt. Es ist dabei unerheblich, ob der Inhalt aus einer vertrauenswürdigen Quelle kommt oder aus einer Benutzereingabe. Eine Nichtbeachtung der Ausgabekontextregeln ist einer der häufigsten Programmierfehler und führt in der Regel zu Injection-Lücken (XSS-Injection, SQL-Injection).

Beispiel: Ausgabe in HTML
<?php

printf('<input name="feld" value="%s">', htmlspecialchars($value));

?>

Wenn Sie einen Variableninhalt in ein HTML-Dokument einfügen wollen, müssen eventuell enthaltene HTML-eigene Zeichen beachtet werden. Dazu verwendet man die PHP Funktion htmlspecialchars, die aus den HTML Steuerzeichen <, >, & die HTML Symbole &lt;, &gt;, &amp; und &quot; macht.

Da ein Funktionsaufruf kein Variablenzugriff ist, kann der so ersetzte Wert nicht direkt mittels String Parsing in die Ausgabe eingefügt werden. Statt dessen wird hier die aus C bekannte Funktion printf() genutzt, die als ersten Parameter eine Zeichenkette mit Platzhaltern erhält. Alle weiteren Parameter werden als Werte in die Platzhalter eingesetzt. Der Platzhalter %s steht für eine Zeichenkette.

Ähnliche Überlegungen gelten beim Zusammenbauen von SQL Statements in einem PHP Programm, nur sind hier andere Regeln zu beachten. Es geht dabei vor allem um Anführungszeichen und Backslashes, mit denen ein Angreifer SQL-Statements verfälschen kann. Wenn Sie die MySQL Datenbank nutzen, bietet Ihnen die mysqli-Extension von PHP auf dem mysqli-Objekt die Methode real_escape_string an, um sicherzustellen, dass ein vom Client gesendeter Wert das SQL Statement nicht verfälscht.

Beispiel: Ausgabe in ein SQL-Statement
<?php
// Annahme: Die Variable $db enthält das mysqli-Objekt mit der Datenbankverbindung
$sql = sprintf("SELECT feldliste FROM tabelle WHERE feld1='%s' AND feld2='%s'",
               $db->real_escape_string($variable1),
               $db->real_escape_string($variable2));
?>
Die Funktion sprintf arbeitet ähnlich wie printf, schreibt das Ergebnis aber nicht in die Ausgabe, sondern liefert es als String zurück, den man einer Variablen zuweisen kann.

Ausführliche Informationen zu diesem Thema können Sie unter Programmiertechnik/Kontextwechsel nachlesen.

Debugging (Fehlersuche)[Bearbeiten]

Der Begriff „Bug“ (Käfer) für einen Programmfehler geht noch auf die Lochkartenzeit zurück. Wenn sich in einem Lochkartenstapel eine Ameise verirrt hatte, blockierte sie beim Lesen einer Karte möglicherweise ein Loch und die Karte wurde falsch gelesen. Genauso gut konnte in der damaligen Röhrentechnik ein Insekt im Computer Kurzschlüsse und Fehlfunktionen auslösen. Und damals wie heute weist ein Programmierer die Möglichkeit eines Programmierfehlers weit von sich und erklärt eine Fehlfunktion lieber mit einem Computerdefekt - bis man ihm das Gegenteil beweist.

In einem Programm, das linear von oben nach unten abläuft, kann man sich noch gut ein Bild darüber machen, welche Variable wann welchen Wert enthält. Das tun aber nur die wenigsten Programme. Viel häufiger ist es, dass Programmteile nur unter bestimmten Bedingungen ausgeführt werden, oder durch eine so genannte Schleife wiederholt ablaufen. Ab einer gewissen Komplexität ist dann ein Augenscheinbeweis - also das Feststellen der Richtigkeit des Programmcodes durch reines Betrachten des Programms - nicht mehr möglich, oder es ist einfach zu aufwändig. Solche Programme erstellt man einfach nach bestem Können und lässt sie dann mit Testdaten laufen, um festzustellen, ob das erwartete Ergebnis herauskommt.

Wenn es nicht herauskommt, muss man den Programmablauf logisch nachvollziehen. Sie werden Ihre PHP Programme oft auf einem Server laufen lassen, aber auf diesem Server nur wenige Rechte haben. Der Einsatz von Fehlersuch-Tools, wie sie aus Sprachen wie C oder Java bekannt sind, ist dann schwierig. Es gibt solche Tools für PHP, sie sind aber nicht Teil des PHP Interpreters und ihre Inbetriebnahme ist umständlich oder auf Mietservern nicht möglich.

Einfacher ist es, wenn das Programm seinen Ablauf protokolliert. Als Programmierer haben Sie einen Plan davon, wie der Ablauf für bestimmte Daten sein sollte, und müssen nachweisen, dass dieser Plan vom Programm eingehalten wird. Dazu fügen Sie echo Befehle in Ihr Programm ein, die eine Information über die aktuelle Programmstelle ausgeben. Das geschieht natürlich nicht wahllos. An Hand des beobachteten Fehlverhaltens kann man zumeist eine Vermutung entwickeln, welcher Programmteil sich irregulär verhält, und dort die Ausgabebefehle einfügen.

Das kann einfach ein Text sein, zumeist werden Sie aber wissen wollen, ob in Ihren Variablen das steht, was Sie vermuten. An dieser Stelle ist das automatische Konvertieren in einen String, das PHP für viele Werte automatisch ausführt, oft nicht genau genug. Verwenden Sie dann die Funktion var_dump().

Beispiel: Ausgabe der Werte einer Variable
<?php
  $variable = "Test";
  $sinnDesLebens = 42;
  $wahrheit = false;
  var_dump($variable);
  var_dump($sinnDesLebens);
  var_dump($wahrheit);
?>
Die Ausgabe sieht dann so aus:

string(4) "Test" int(42)

bool(false)

Um den Inhalt einer komplexen Variable (Array, Objekt) auszugeben, benötigt PHP mehrere Zeilen. Damit die Zeilenumbrüche im HTML-Kontext erhalten bleiben und damit die Übersichtlichkeit der Ausgabe, können Sie vorher ein <pre>-Element ausgeben. Alternativ können Sie sich auch im Browser die Quelltextansicht der Seite anschauen.

Konstanten[Bearbeiten]

Konstanten können wie Variablen Werte enthalten.

Sie unterscheiden sich darin, dass sie aber im Ablauf des Skripts nicht mehr geändert oder gelöscht werden können (daher auch der Name). Konstanten sind im ganzen Skript verfügbar. Dies schließt auch Funktionsrümpfe mit ein, obwohl eine Konstante nicht dort definiert wurde. Konstanten werden z.B. häufig für Einstellungen gesetzt, aber auch für spezielle Parameterwerte für Funktionen wie z.B. beim error_reporting. Sie können nur Skalare Werte sowie den speziellen Datentyp NULL enthalten.


Beispiel: Definieren einer Konstante
<?php
  // dauerhafte Festlegung
  define ('MWST', 0.19);

  // Beispiel
  $preis = 99.95;
  $gesamt = $preis + ($preis * MWST);
?>

Im Beispiel wird der Mehrwertsteuersatz nicht als Variable, die überschrieben werden kann, sondern als dauerhafte Konstante festgelegt.

Anders als Variablen erhalten Konstanten kein führendes Dollarzeichen ($). Sie unterliegen aber den selben Namenskriterien wie Variablen. Sie können somit auch nicht mit Ziffern anfangen. Konstanten werden zusätzlich üblicherweise komplett in Großbuchstaben geschrieben.

  • Achtung
Beachten Sie: In älteren PHP-Versionen hatte define() einen Parameter case_insensitive, mit dem Konstanten Groß- und Kleinschreibung ignorierten. Dieses Parameter wurde in PHP7 entfernt.


Weblinks[Bearbeiten]