PHP/Datentypen
Interne Datentypen
PHP arbeitet weitestgehend typlos. Wann immer möglich wird PHP den Datentyp selbst erkennen und umwandeln.
Allgemein wird zwischen drei Datentypen unterschieden. PHP5 kennt für Variablen folgende Datentypen.
Skalare Datentypen | |
---|---|
integer, int | Ganzzahl. "int" ist eine alternative Schreibweise für "integer". |
boolean, bool | Logischer Wert ("TRUE" oder "FALSE"), intern 0 oder 1. "bool" ist eine alternative Schreibweise für "boolean". |
double, real | Fliesskommazahl. "real" ist eine alternative Schreibweise für "double". |
string | Zeichenkette mit 0 bis 2 Milliarden Zeichen. |
Komplexe Datentypen (Zusammensetzungen) | |
array | Array. Es kann mehrere Elemente enthalten. |
object | Objekt |
Spezielle Datentypen (zur systeminternen Verwendung) | |
resource | Eine Ressource, also ein Zeiger auf eine Datei, Datenbank oder ähnliche externe Datenquelle. Eine Umwandlung in andere Typen ist nicht möglich. Die Ausgabe erzeugt Angaben wie "Resource#5". |
Im Vergleich zu richtigen Programmiersprachen sind die Möglichkeiten begrenzt, für den praktischen Gebrauch aber ausreichend.
Automatische Typumwandlung
Bei der automatischen Typumwandlung versucht PHP zuerst, die rechte Seite des Ausdrucks zu erkennen und dann der linken seite zuzuweisen. Dabei geht PHP nach folgenden Regeln vor:
- Bei in doppelten Anführungszeichen (") eingeschlossenen Werten wird eine Zeichenkette angenommen.
- Bei einer Zahl ohne Punkt (Komma) wird eine Ganzzahl angenommen.
- Bei einer Zahl mit Punkt (Komma) wird eine Fliesskommazahl angenommen.
Bei der Auswertung von Ausdrücken bestimmt der verwendete Operator den Typ des Gesamtausdrucks. Wenn dadurch ein numerischer Ausdruck erzwungen wird, versucht PHP einen folgenden Zeichenkettenausdruck nach Zahlen zu durchsuchen.
$variable = "A";
echo (++$variable);
echo "<br />\n";
$variable = 17;
echo (++$variable);
echo "<br />\n";
$variable = 17;
$variable = $variable + 23.5;
echo ($variable);
echo "<br />\n";
|
B 18 40.5 |
Die Zeichenkette "5 Stück" wird hier zu "5" umgewandelt.
$variable = 12;
$variable = $variable + "5 Stück";
echo ($variable);
|
17 |
Der Punkt ist der Operator für eine Verknüpfung von Zeichenketten, sodass als Ergebnis "125 Stück" ausgegeben wird.
echo "<br />\n";
$variable = 12;
$variable = $variable . "5 Stück";
echo ($variable);
|
125 Stück |
Datentypen umwandeln
Um einen Datentyp zu erzwingen, kann die Bezeichnung des Datentyps dem Ausdruck vorangestellt werden. Da die Datentypumwandlung mit Operatoren Vorrang hat, wird der Einsatz nur da unbedingt nötig sein, wo es keine eindeutigen Operatoren gibt.
$variable = 100;
$fvar = (double) $variable + "100.5";
$svar = (int) $fvar;
echo ("Double: $fvar , Integer: $svar");
|
Double: 200.5 , Integer: 200 |
Umwandlungen sind nicht in alle Richtungen sinnvoll.
Zieltyp | Sinnvolle Quelltypen | Umwandlungsprinzip |
---|---|---|
integer | boolean | "TRUE" wird zu "1", "FALSE" wird zu "0". |
double | Dezimale werden abgeschnitten (keine Rundung). | |
string | Wird keine Zahl erkannt, so wird "0" zurückgegeben. | |
double | integer | Unverändert. |
string | Wird keine Zahl erkannt, so wird "0" zurückgegeben. | |
string | double integer |
Gibt die Zahl als Zeichenkette zurück. |
array | double integer string |
Es entsteht ein Array mit einem Element vom Ursprungstyp. |
object | Wird direkt umgewandelt. | |
object | array | Wird direkt umgewandelt. |
double integer string |
Es entsteht ein Objekt mit einer Eigenschaft, die durch die Variable dargestellt wird. | |
boolean | double integer |
"0" wird zu "FALSE", jede andere Zahl wird zu "TRUE". |
Bei der Umwandlung von Zeichenketten wendet PHP5 bestimmte Regeln an:
- double entsteht, wenn die Zeichenkette mit einem gültigen numerischen Zeichen (Ziffer, Plus, Minus) beginnt und dahinter die Zeichen ".", "e" oder "E" folgen. Ist der erste Teil der Zeichenkette ein gültiger Ausdruck, so wird der Rest nicht beachtet.
- integer entsteht, wenn die Zeichenkette mit einem gültigen numerischen Zeichen (Ziffer, Plus, Minus) beginnt und dahinter nicht die Zeichen ".", "e" oder "E" folgen. Ist der erste Teil der Zeichenkette ein gültiger Ausdruck, so wird der Rest nicht beachtet.
Die Zeichen "e" oder "E" dienen der Darstellung von Exponenten. Die Schreibweise "En" steht für "x10n". Allgemein dient der Punkt "." als Dezimaltrennzeichen. Zur Ausgabe lassen sich Zahlen mit der Funktion "number_format" in die benötigte Form bringen.
Umwandlungsfunktionen
Neben der Angabe des Datentyps in runden Klammern kann auch die Funktion "settype" genutzt werden. Als erster Parameter wird die umzuwandelnde Variable angegeben, als zweiter Parameter der Datentyp als Zeichenkette. Die Funktion gibt "1" ("TRUE") zurück, wenn die Umwandlung erfolgreich war, sonst "0" ("FALSE").
settype($variable, "integer");
|
Zusätzlich können auch die abgeleiteten "val"-Funktionen verwendet werden. Diese geben die umgewandelte Variable zurück, wenn die Umwandlung erfolgreich war.
Funktion | Beschreibung |
---|---|
doubleval($variable) | Umwandlung in den Datentyp "double". |
intval($variable) | Umwandlung in den Datentyp "integer". |
strval($variable) | Umwandlung in den Datentyp "string". |
Datentypen bestimmen
Um herauszufinden, welcher Datentyp genutzt wird, kann die Funktion "gettype" eingesetzt werden. Sie gibt die bekannten Typbbezeichner als Zeichenkette zurück. Konnte der Datentyp nicht erkannt werden, so wird die Zeichenkette "unknown type" erzeugt.
echo "Der Datentyp ist: ", gettype($variable);
|
Bei logischen Ausdrücken ist die Verwendung von "gettype" zu umständlich, es können deshalb folgende Funktionen eingesetzt werden, die "1" ("TRUE") oder "0" ("FALSE") zurückgeben.
Funktion | "TRUE" bei folgendem Datentyp |
---|---|
is_array($variable) | array |
is_bool($variable) | boolean |
is_double($variable) is_real($variable) |
double |
is_integer($variable) is_long($variable) |
integer |
is_object($variable) | object |
is_string($variable) | string |
Mit der etwas allgemeineren Funktion "is_scalar" können die Grunddatentypen (die sogenannten Skalare) erkannt werden. Dies sind die Datentypen "boolean", "float", "integer" und "string". Arrays und Objekte sind dagegen zusammengesetzte Datentypen, also keine Skalare.
Besondere Variablenzustände bestimmen
Mit der Funktion "is_resource" kann auch die besondere Form "resource" getestet werden. Damit kann etwa nach einem Datei- oder Datenbankzugriff ermittelt werden, ob dieser erfolgreich verlief. Solche Funktionen geben Handler zurück, die PHP in späteren Funktionsaufrufen verwendet, um wieder Verbindung mit der Quelle aufzunehmen.
Die Funktion "get_resource_type" gibt nicht nur die Auskunft zurück, ob eine Ressource existiert, sondern auch ihren Datentyp. Sie gibt eindeutige Zeichenketten wie "file" oder "mysql link" zurück.
Manche Variablen haben den Wert "NULL" - sie sind dann zwar schon angelegt, aber völlig leer. Leer ist ein anderer Zustand als eine leere Zeichenkette (die ja immerhin schon eine Zeichenkette ist) oder die Zahl "0" (die eindeutig eine Zahl ist, also mehr als nichts). Der Unterschied wird bei einfachen Vergleichen mit "==" nicht immer klar, weil hier interne Datentypumwandlungen stattfinden und nur Werte, nicht jedoch Typen betrachtet werden. Folgender Ausdruck ist also wahr:
$zahl = 0;
if ($zahl == NULL) echo "wahr";
|
Das ist aber eigentlich nicht richtig, denn "NULL" ist ein anderer Zustand als "0", wie eben beschrieben. Der Operator "===" bezieht deshalb den Datentyp mit ein und entscheidet richtig, dass "0" nicht gleich "NULL" ist.
Variablen können Namen von Funktionen enthalten und zum indirekten Aufruf der Funktion benutzt werden. Um zu prüfen, ob eine Variable einen derartigen "aufrufbaren" Namen enthält, wird die Funktion "is_callable" verwendet. Wenn es sich beim Aufrufziel um die Methode einer Klasse handelt, so erfolgt die Ausgabe in der Form "array($object, 'Methodenname')", vollständig also wie folgt.
is_callable(array($object, "Methodenname"));
|
Variablen auf Vorhandensein testen
Die Funktion "empty" prüft, ob einer Variable ein Wert zugewiesen wurde. Ist die Variable vorhanden und besteht ihr Inhalt aus "0" oder einer leeren Zeichenkette, so wird "1" ("TRUE") zurückgegeben.
$leer = empty($variable);
|
Die Funktion "isset" prüft, ob eine Variable existiert. Bei logischen Vergleichen kann es entscheidend sein, ob eine Variable mit "0" oder einer leeren Zeichenkette gefüllt ist, oder überhaupt noch nicht zugewiesen wurde. Bei Vorhandensein der Variable wird "1" ("TRUE") zurückgegeben, sonst "0" ("FALSE").
$exists = isset($variable);
|
Der Umgang mit den Funktionen "empty" und "isset" kann aufgrund der primitiven internen Darstellung der Variableninhalte in PHP zu kniffligen Programmierfallen führen. Die folgende Tabelle enthält deswegen alle möglichen Kombinationen von Zuständen für Variablen und der Reaktionen der beiden Funktionen. Dabei sollte man sich vergegenwärtigen, was PHP intern darstellt. So ist etwa der einer Variablen zuweisbare Zustand "TRUE" identisch mit der Zuweisung "$str = 1;". Um sicherzugehen, ob die Variable als Inhalt "FALSE" zurückgibt oder tatsächlich nicht definiert ist, eignet sich folgender Ausdruck.
if !( isset($str) ) { ... }
|
Zustand nach | if(function($str)) { ... } | if(formel) { ... } | ||||||
---|---|---|---|---|---|---|---|---|
empty | !empty | isset | !isset | empty | !empty | isset | !isset | |
unset($str) | true | false | false | true | true | false | false | true |
$str = "" | true | false | true | false | true | false | false | true |
$str = 0 | true | false | true | false | true | false | false | true |
$str = "0" | false | true | true | false | false | true | false | true |
$str = "x" | false | true | true | false | false | true | true | false |
$str = 1 | false | true | true | false | false | true | true | false |
$str = true | false | true | true | false | false | true | true | false |
$str = false | true | false | true | false | true | false | false | true |
$str = array() | true | false | true | false | false | false | false | true |
$str = array("x") | false | true | true | false | false | false | true | false |
class foo; $s = new foo; |
true | false | true | false | false | false | false | true |
class foo [var $a]; $s = new foo; |
false | true | true | false | false | false | true | false |
Der Zustand "NULL" einer Variablen entsteht, wenn diese existiert, aber nichts enthält. Dies ist unter Umständen genauer als "empty", weil der Wert "0" eben doch ein Wert ist, während "NULL" für "nichts" steht. "NULL" existiert auch als Konstante zum Zuweisen des "nichts". Es ist aber nicht möglich, "is_null($wert)" durch den Vergleich "$wert == NULL" zu ersetzen, weil Vergleiche immer Werte vergleichen, während die "is"-Funktionen den Datentyp ermitteln. Wenn "$wert" die Zahl "0" enthält, so wird diese für den Vergleich (Boolescher Operator) in "FALSE" umgewandelt und dann mit "NULL" verglichen, was intern auch "FALSE" entspricht, woraus dann "0 == NULL" ist "TRUE" folgt, was vermutlich nicht der erwarteten Logik entspricht.
Mit der Funktion "unset" kann eine Zuweisung aufgehoben und so eine Variable zum Verschwinden gebracht werden.
unset($variable);
|
Anzeige von Informationen über eine Variable
Um den Inhalt einer Variablen direkt an den Webbrowser zu senden, können folgende drei Befehle verwendet werden. Es empfiehlt sich, die Ausgabe innerhalb von "<pre>"-Tags zu setzen, da alle Funktionen die Zeilenschaltung "\n" benutzen und nicht primär HTML erzeugen.
Befehl | "TRUE" bei folgendem Datentyp |
---|---|
var_dump | Erzeugt eine Ausgabe der Variablenstruktur und des Inhalts. Bei Objekten ist die Ausgabe auf öffentliche Mitglieder beschränkt. |
var_export | Erzeugt eine Ausgabe der Variablenstruktur und des Inhalts, die Darstellung erfolgt jedoch so, dass es sich um derart gestalteten PHP-Code handelt, mit dem die ursprüngliche Variable wieder erzeigt werden könnte. Bei Objekten werden auch private Mitglieder ausgegeben. |
print_r | Erzeugt eine Ausgabe der Variablenstruktur und des Inhalts in gut lesbarer Form. Bei Objekten werden auch private Mitglieder ausgegeben. |