PHP/Datentypen

Aus Mikiwiki
< PHP
Wechseln zu: Navigation, Suche

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.