# Variablen und Operatoren

Die Leute, die glauben, dass sie Computer hassen, hassen in Wirklichkeit nur die schlechten Programmierer.
Larry Niven

# Variable

Wie prinzipiell jede Programmiersprache, die ernst genommen werden will, verfügt auch PHP über die Möglichkeit, Variablen verwenden zu können. Variablen kennzeichnen einen Speicherbereich, in dem während der Ausführung des Programms Werte gespeichert werden können.

In den meisten Sprachen muss vor der Verwendung einer Variablen jedoch festgelegt werden, von welchem Typ diese Variable sein soll. So z. B. in Perl: Dort wird der Typ der Variablen durch ein vorangestelltes Zeichen identifiziert ($ für Skalare, @ für Listen und % für Hashes). Diese Unterscheidung existiert in PHP jedoch nicht. Hier beginnen alle Variablen mit dem Dollarzeichen $, gefolgt von einer beliebigen Zeichenkette. Erst durch die Verwendung und die Zuweisung eines Wertes definiert sich der Typ der Variablen.

# Variablen bezeichnen

Um einer Variablen einen Namen zu geben, können Sie sowohl die Buchstaben von a bis z und von A bis Z verwenden und die Zahlen von 0 bis 9 als auch den Unterstrich _. Zusätzlich dürfen Sie auch Zeichen verwenden, die dem ASCII-Code 127 bis 255 entsprechen.

Außerdem sind Variablennamen in PHP case-sensitive, d. h., es wird zwischen Groß- und Kleinschreibung unterschieden.

$VAR = "Er";  
$var = "Sie";  
$vaR = "Es";  
echo "$VAR, $var, $vaR";

Dieses Beispiel würde im Browser die Ausgabe Er, Sie, Es erzeugen, da bei allen drei Zuweisungen unterschiedliche Variablen angesprochen werden – trotz gleich klingender Namen.

Nach dem Dollarzeichen $ darf übrigens nur ein Buchstabe oder der Unterstrich folgen, um einen gültigen Namen für eine Variable zu vergeben.

$abc123 = "abc und 123"; // gültig, da Buchstabe am Anfang  
$_abc = "ABC";           // gültig, da Unterstrich am Anfang  
$1_abc = "Ein ABC";      // ungültig, da Zahl am Anfang  
$töterö = "Elefant";     // gültig, da ö dem ASCII-Code 246 entspricht

# Datentypen

Variablen in PHP definieren sich also durch den ihnen zugewiesenen Wert. Welche Datentypen es im Einzelnen gibt, soll nun in diesem Kapitel genauer betrachtet werden.

PHP unterscheidet generell zwischen acht primitiven Datentypen.

  • Integer
  • Fließkommazahl
  • Boolean
  • String
  • Array
  • Object
  • Resource
  • NULL

# Integer

Unter den primitiven Datentyp Integer fallen Dezimalzahlen, Oktalzahlen und auch hexadezimale Zahlen. Durch unterschiedliche Schreibweisen bei der Wertzuweisung entscheidet sich dann, welcher Datentyp zum Einsatz kommt.

$x = 1024;  
$x = -512;

Bei einer solchen Zuweisung wird der Typ der Variablen auf Dezimalzahl gesetzt. Dabei darf der Wert positiv oder negativ sein. Die maximale Größe einer solchen Zahl ist plattformabhängig. Üblich ist jedoch eine Größe von 32 Bit (232).

$x = 0123;    // Dezimal = 83

Diese Schreibweise weist der Variablen $x den Typ Oktalzahl zu. Auch bei Oktalzahlen ist ein negativer und positiver Wertebereich erlaubt. Oktalzahlen werden immer durch eine führende 0 definiert.

$x = 0xFF;    // Dezimal = 255  
$x = 0x99;    // Dezimal = 153

Dies ist die Schreibweise für eine hexadezimale Zahl. Hexadezimale Zahlen werden immer durch das Präfix 0x definiert.

# Fließkommazahl

Fließkommazahlen werden in der Regel auch als »Floatingpoint« oder kurz »Float« bezeichnet. Mögliche Schreibweisen sind:

$x = 1.024;  
$x = 1.2e6;  
$x = 5E-10;

Auch die Größe einer Fließkommazahl ist plattformabhängig. In der Regel ist sie jedoch auf 64 Bit mit einer Genauigkeit von 14 Nachkommastellen festgelegt.

# Boolean

Variablen des Typs Boolean sind Wahrheitswerte und können entweder den Wert TRUE oder FALSE erhalten.

$x = TRUE;  
$x = FALSE;  
$x = True;  
$x = fALSE;

Ob Sie TRUE bzw. FALSE nun groß- oder kleinschreiben, bleibt Ihnen überlassen. Wegen der besseren Lesbarkeit des Quelltextes wird in der Regel aber die Großschreibung verwendet.

Wenn Sie den Wert eines Booleans ausgeben möchten, müssen Sie beachten, dass TRUE als 1 und FALSE als leere Zeichenkette ausgegeben wird.

# String

Strings sind Zeichenketten und, wie in vielen Scriptsprachen üblich, können Sie sich aussuchen, ob Sie doppelte oder einfache Anführungszeichen verwenden.

$x = "Hallo";     // doppelte Anführungszeichen  
$x = 'Hallo';     // einfache Anführungszeichen

Es gibt jedoch einen Unterschied. Wenn Sie doppelte Anführungszeichen verwenden, werden Variablen, die innerhalb einer Zeichenkette notiert wurden, automatisch aufgelöst.

$x = 5;  
echo "Es ist nun $x Tage her, dass...";

Dieses Beispiel würde die Ausgabe

Es ist nun 5 Tage her, dass...

erzeugen. Die Variable $x, die innerhalb der Zeichenkette notiert wurde, ist also durch ihren Wert ersetzt worden. Dagegen würde das Beispiel

$x = 5;  
echo 'Es ist nun $x Tage her, dass...';

die Ausgabe

Es ist nun $x Tage her, dass...

erzeugen. Möchten Sie nun aber auch Anführungszeichen im Browser ausgeben, kann dies zu Problemen führen. Würden Sie das folgende Beispiel ausprobieren

echo 'I'll be back';

quittiert Ihnen PHP dies mit einer Fehlermeldung. Nun haben Sie zwei Möglichkeiten, das Problem zu lösen: Entweder verwenden Sie doppelte Anführungszeichen oder das Escape-Zeichen \\.

echo "I'll be back";  
echo 'I\'ll be back';

Beides sind akkurate Lösungen. Um wiederum das Escape-Zeichen auflösen zu können, müssen Sie zwei Backslashes hintereinander notieren.

echo "Alle Daten auf Laufwerk C:\\ löschen?";  
  // Ausgabe: Alle Daten auf Laufwerk C:\ löschen?

Bei der Verwendung von doppelten Anführungszeichen kennt PHP jedoch noch mehr Escape-Sequenzen.

Sequenz Erklärung
\n Zeilenumbruch
\r Wagenrücklauf
\t Tabulator
\" Doppeltes Anführungszeichen
$ Dollarzeichen
\\ Backslash

Tabelle 2.1: Escape-Sequenzen bei Verwendung von doppelten Anführungszeichen

Bei einfachen Anführungszeichen kennt PHP nur die Escape-Sequenzen \\ und \\'.

Wenn Sie versuchen, abhängig davon, welche Anführungszeichen Sie benutzen, eine andere als die erlaubte Escape-Sequenz zu verwenden, wird der Backslash mit ausgegeben.

# Nützliche Funktionen

Mit der Funktion isset können Sie überprüfen, ob eine Variable existiert.

int isset(mixed var)

Wenn die Variable existiert, liefert die Funktion TRUE zurück, andernfalls FALSE.

Die Funktion unset hingegen löscht eine Variable, und zwar nicht nur den Wert, sondern die vollständige Variable.

int unset(mixed var)

Wenn die Variable erfolgreich gelöscht wurde, liefert die Funktion TRUE zurück; wenn nicht, dann FALSE.

$x = 5;  
echo isset($x);  
unset($x);  
echo isset($x);

Auch die Funktion gettype ist unter Umständen sehr hilfreich. Sie ermittelt den Typ einer Variablen und gibt eine entsprechende Zeichenkette zurück.

$x = 5;  
echo "Die Variable \$x ist vom Typ ";
echo gettype($x);

Die Ausgabe lautet:

Die Variable $x ist vom Typ integer

# Typumwandlung

Neben der automatischen Typendefinition können Sie mit speziellen Anweisungen auch eine explizite Typumwandlung vornehmen.

Der gewünschte Datentyp wird dann in runden Klammern nach dem Zuweisungsoperator = notiert.

$x = "5";  
echo gettype($x);  
$x = (int) $x;  
echo gettype($x);

Folgende Zieldatentypen sind erlaubt:

Datentyp Erklärung
int, integer Umwandlung in Ganzzahl
string Umwandlung in Zeichenkette
float, double, real Umwandlung in Fließkommazahl
array Umwandlung in Array
object Umwandlung in Objekt

Tabelle 2.2: Zieldatentypen für eine explizite Typumwandlung

$x = 5.123;  
echo gettype($x);  
$x = (string) $x;  
echo gettype($x);

# Arrays

Arrays sind Anordnungen von Variablen. Das zugehörige Äquivalent in Perl sind Listen und Hashes, wobei in PHP diese beiden Typen vereint sind. Aus diesem Grund unterscheidet man auch zwischen drei Array-Gruppen: einfachen Arrays, assoziativen Arrays und mehrdimensionalen Arrays.

Einfache Arrays bestehen aus einer bestimmten Menge von Variablen, die durch einen Index angesprochen werden. Dies kann sowohl bei der Wertzuweisung als auch beim Zugriff erfolgen.

$staedte[0] = "Berlin";  
$staedte[1] = "Hamburg";  
$staedte[2] = "Bremen";  
$staedte[3] = "Stuttgart";

Die Ausgabe eines Wertes eines Arrays erfolgt dann über den Index, z. B.:

echo $staedte[2];

Bei der Definition eines Arrays können Sie den Index auch auslassen. Alle neuen Einträge im Array werden dann automatisch mit 0 beginnend indiziert.

$staedte[] = "Berlin";  
$staedte[] = "Hamburg";  
$staedte[] = "Bremen";  
$staedte[] = "Stuttgart";

Analog sind auch die folgenden Schreibweisen möglich, ohne Festlegung eines bestimmten Index:

$staedte = Array("Berlin","Hamburg","Bremen","Stuttgart");

Wollen Sie auch bei dieser Schreibweise explizit einen Index festlegen, müssen Sie den Index notieren, gefolgt von => und anschließend dem Wert.

$staedte = Array(1 => "Berlin",  
                 2 => "Hamburg",  
                 0 => "Bremen",  
                 3 => "Stuttgart");

Assoziative Arrays verwenden anstelle einer Indexnummer einen so genannten Schlüssel.

$laender["DE"] = "Deutschland";  
$laender["FR"] = "Frankreich";  
$laender["ES"] = "Spanien";  
$laender["CH"] = "Schweiz";

Dementsprechend ist auch wieder eine kürzere Schreibweise möglich.

$laender = Array("DE" => "Deutschland",  
                 "FR" => "Frankreich",  
                 "ES" => "Spanien",  
                 "CH" => "Schweiz");

Der Zugriff auf ein Element eines assoziativen Arrays erfolgt dann über den Schlüssel, z. B.:

echo $laender["DE"];

Solche Arrays enthalten prinzipiell weitere Arrays und werden durch die Angabe mehrere Indizes angesprochen. Stellen Sie sich dazu einfach eine Tabelle vor, die in Spalten und Zeilen unterteilt ist.

$tabelle["A"][1] = "Berlin";  
$tabelle["B"][2] = "Hamburg";  
$tabelle["C"][1] = "Bremen";  
$tabelle["D"][3] = "Stuttgart";

Zum Auslesen eines Wertes eines mehrdimensionalen Arrays verwenden Sie wieder die Indizes, z. B.:

echo $tabelle["D"][3];

# Resource und NULL

Resource und NULL sind zwei sehr spezielle Datentypen, die Sie sicherlich nicht sehr oft verwenden werden.

Variablen vom Typ Resource sind Referenzen auf eine externe Datenquelle, wie z. B. eine Datenbank. Sie dienen dazu, Zugriffe auf Datenbanken und ähnliche Datenquellen zu erleichtern, indem für jeden offenen Zugriff eine Variable des Typs Resource definiert wird und die ID des Zugriffs in dieser Variablen gespeichert wird. Nur dadurch ist es z. B. möglich, auf zwei Datenbanken gleichzeitig zuzugreifen.

Verwechseln Sie den Datentyp NULL nicht mit dem Wert 0 (denn die Zahl 0 ist ein Wert). NULL ist nämlich ein Wert, dem »nichts« entspricht. Selbst ein leerer Wert ist immer noch ein Wert, denn er besitzt einen Zustand, nämlich leer. Das folgende Beispiel soll dies verdeutlichen.

$a = 5;  
echo isset($a);  
$a = NULL;  
echo isset($a);

Die Zuweisung von NULL an $a endet mit dem gleichen Effekt wie die Anweisung

unset($a);

Die Schreibweise von NULL ist übrigens egal, es sind sowohl NULL als auch null, Null oder nUlL möglich. Der Übersichtlichkeit halber sollten Sie NULL aber groß schreiben.

# Operatoren

Auch PHP kennt eine Menge unterschiedliche Operatoren, wie z. B. logische Operatoren oder arithmetische Operatoren. Diese Operatoren sind übrigens stark an Perl und C angelehnt, was wieder einmal die Verwandtschaft zu diesen Sprachen zeigt.

# Arithmetische Operatoren

Arithmetische Operatoren dienen zur Berechnung bzw. Verknüpfung von Zahlenwerten.

Operator Rechenart Beispiel Ergebnis
+ Addition $x = 5 + 3; Summe 8
- Subtraktion $x = 10 – 5; Differenz 5
* Multiplikation $x = 2 × 2; Produkt 4
/ Division $x = 32 / 2; Quotient 16
% Modulo $x = 13  % 7; Rest 6

Tabelle 2.3: Arithemtische Operatoren in PHP

Der Ergebnistyp einer Division ist im Übrigen immer vom Typ Fließkommazahl, auch wenn die beiden Operanden vom Typ Ganzzahl sind. Nur durch die explizite Typumwandlung mit int oder integer erhalten Sie eine Ganzzahl.

$x = 13 / 7;  
$x = (int) $x;  
$y = 13 % 7;  
echo "13 geteilt 7 ist gleich $x Rest $y";

Die Ausgabe lautet:

13 geteilt 7 ist gleich 1 Rest 6

Die Verkettung von arithmetischen Operatoren ist auch möglich, wobei die Regel Punkt-vor-Strich-Rechnung zum Tragen kommt.

$x = 2 + 2 * 2;      // Ergebnis = 6  
$x = 50 / 10 + 40;   // Ergebnis = 45

Die Punkt-vor-Strich-Rechnung lässt sich jedoch auch durch das Setzen von runden Klammern beeinflussen.

$x = (2 + 2) * 2;    // Ergebnis = 8

Damit auch in PHP nicht solche Schreibweisen wie

$x = $x + 1;

verwendet werden müssen, um den Wert von $x um 1 zu inkrementieren, können Sie die kürzere Schreibweise

$x++;

verwenden. Dies ist natürlich auch beim Dekrementieren möglich:

$x = $x1

oder kürzer:

$x--;

Es gibt auch eine allgemeinere Verkürzung bei der Verwendung von arithmetischen Operatoren. Konstrukte wie

$x = $x + 5;  
$y = $y * 3;  
$z = $z / 10;  
$xyz = $xyz30;

lassen sich auch folgendermaßen schreiben:

$x +=  5;  
$y *=  3;  
$z /=  10;  
$xyz -=  30;

# Vergleichsoperatoren

Mit Hilfe von Vergleichsoperatoren ist es möglich, zwei Werte miteinander zu vergleichen. In dieser Hinsicht besticht PHP durch seine Einfachheit. Während in Perl zwischen dem Vergleich von Zahlenwerten und Zeichenketten unterschieden werden muss, können Sie dies in PHP getrost ignorieren.

Das Ergebnis eines Vergleiches ist immer vom Typ Boolean.

Vergleich Operator Beispiel Ergebnis
Sind die Werte gleich? == 1 == 1 Wahr
Sind die Werte gleich? == 1 == 2 Unwahr
Sind die Typen identisch? === 1 === 3 Wahr
Sind die Typen identisch? === 1 === "A" Unwahr
Sind die Werte ungleich? != 1 != 2 Wahr
Sind die Werte ungleich? != 1 != 1 Unwahr
Sind die Werte ungleich? <> 1 <> 2 Wahr
Sind die Werte ungleich? <> 1 <> 1 Unwahr
Sind die Werte nicht identisch? !=== 1 !=== "A" Wahr
Sind die Werte nicht identisch? !=== 1 !=== 2 Unwahr
Ist der linke Wert kleiner? < 1 < 3 Wahr
Ist der linke Wert kleiner? < 3 < 1 Unwahr
Ist der linke Wert größer? > 3 > 2 Wahr
Ist der linke Wert größer? > 2 > 3 Unwahr
Ist der linke Wert kleiner oder gleich? <= 1 <= 2 Wahr
Ist der linke Wert kleiner oder gleich? <= 2 <= 2 Wahr
Ist der linke Wert kleiner oder gleich? <= 3 <= 1 Unwahr
Ist der linke Wert größer oder gleich? >= 5 >= 2 Wahr
Ist der linke Wert größer oder gleich? >= 5 >= 5 Wahr
Ist der linke Wert größer oder gleich? >= 3 >= 5 Unwahr

Tabelle 2.4: Vergleichsoperatoren in PHP

Zusätzlich gibt es noch den Trinitätsoperator, der bei den Vergleichsoperatoren eine Sonderrolle spielt. Er entspricht einem einfachen Entweder-oder-Vergleich. Die Syntax lautet:

(ausdruck1) ? (ausdruck2) : (ausdruck3);

Ist das Ergebnis des ersten Ausdrucks TRUE, wird der zweite Ausdruck zurückgegeben. Ist das Ergebnis des ersten Ausdrucks FALSE, wird der dritte Ausdruck zurückgegeben.

Ein Beispiel:

$x = 5;  
$a = ($x == 5) ? "fünf" : "nicht fünf";  
echo $a;

# Zeichenkettenoperatoren

Es gibt eigentlich nur einen Zeichenkettenoperator bzw. zwei, wenn man die Kurzschreibweise des Operators hinzuzählt. Um zwei Zeichenketten miteinander verbinden zu können, müssen Sie den Konkatenationsoperator . verwenden.

$str1 = "Hallo ";  
$str2 = "Welt!";  
$str3 = $str1 . $str2;  
echo $str3;

Die Ausgabe lautet:

Hallo Welt!

Mit der Kurzschreibweise .= können Sie folgende Konstrukte

$str = "Hallo ";  
$str = $str + "Welt!";

durch folgende Schreibweise ersetzen:

$str = "Hallo ";  
$str .= "Welt!";

# Logische Operatoren

Die logischen Operatoren dienen zur Verknüpfung mehrerer Teilausdrücke.

($a == 5) AND ($b == 3)

Der AND-Operator verbindet zwei Teilausdrücke und liefert TRUE, wenn beide Teilausdrücke TRUE sind. Alternativ können Sie für AND auch && verwenden.

($a == 5) OR ($b == 3)

Der OR-Operator verbindet zwei Teilausdrücke in der Form, dass das Ergebnis TRUE ist, sobald einer der beiden Teilausdrücke TRUE ist. Alternativ können Sie für OR auch || verwenden.

($a == 5) XOR ($b == 3)

Nur wenn einer der beiden Teilausdrücke TRUE ist, ist das Ergebnis TRUE. Sind beide Teilausdrücke TRUE oder FALSE, ist auch das Ergebnis FALSE.

!($a == 5)

Der !-Operator negiert einen Ausdruck. Das Ergebnis lautet TRUE, wenn $a == 5 FALSE ist.

Auch logische Operatoren unterliegen einer Rangordnung, wie z. B. +, –, * und /. Auch hier können Sie mit runden Klammern die Priorität der einzelnen Operatoren beeinflussen. So hat nämlich auch der &&-Operator Vorrang vor dem ||-Operator, und auch der AND-Operator hat Vorrang vor dem OR-Operator. Jedoch haben die symbolischen Operatoren (&& und ||) wiederum Vorrang vor den literalen (AND und OR) Operatoren.

Beispiel:

$a == 5 OR $b == 3 AND $c = 4  
  // TRUE, wenn $c gleich 4 und $b gleich $ ODER $a gleich 5  
($a == 5 OR $b == 3) AND $c = 4  
  // TRUE, wenn $c gleich 4 UND $a gleich 5 oder $b gleich 3

# Zusammenfassung

  • Alle Variablen in PHP werden durch $-Zeichen eingeleitet.
  • Variablen können vom Typ Boolean, Integer, Fließkommazahl, String, Array, Object, Resource oder NULL sein.
  • Bei Arrays interscheidet man einfache, assoziative und mehrdimensionale Arrays.
  • Resource-Variablen werden z. B. für Datenbankverbindungen verwendet.
  • NULL ist ein Datentyp, dem »nichts« entspricht.

# Fragen und Übungen

  1. Welche Operatoren stehen für arithmetische Operationen zur Verfügung (mathematische Berechnungen)?
  2. Welche Vergleichsoperatoren gibt es?
  3. Welche Zeichen dürfen Sie bei der Namensgebung von Variablen verwenden?
  4. Ist der Bezeichner $tätäää erlaubt?