0251 / 590 837 15
info@a-coding-project.de

PHP-Datentypen richtig benutzen

Eines der größten Vorteile von PHP ist seine Einfachheit. Durch den lockeren Umgang mit Datentypen ist es gerade bei Anfängern beliebt und deshalb auch so verbreitet. Nur leider ist diese Einfachheit auch einer der größten Nachteile von PHP. Durch einen zu nachlässigen Umgang mit den Datentypen kann es an einigen Stellen im Quellcode zu Problemen kommen. Deshalb möchte ich euch mit diesem Artikel einen Grundkurs zum Thema geben.

Welche Datentypen gibt es in PHP?

Datentypen sind quasi die Arten, wie Daten gespeichert werden. So kann man eine Zahl als String (Text) oder Int (Ganzzahl) speichern. Von diesem Typen gibt es in PHP die folgenden:

  • string: text
  • int: Ganzzahl (Zahl ohne Nachkommastellen)
  • bool: true oder false
  • double, float oder real: Fließkommazahl (Alles das Gleiche)
  • null: Ein nicht existierender Wert
  • object: Die Instanz einer Klasse
  • array: Array, eine Art Liste.
  • binary: Binärdaten, ab PHP6.
  • resource: Referenzen auf geöffnete Dateien, Datenbankverbindungen,…

Daten konvertieren

In PHP sind viele Variablen als Text gespeichert. Das hat den Hintergrund, dass die Parameter des HTTP-Requests ($_GET, $_POST oder $_REQUEST) als Text und somit als String übertragen werden. Um diesen Text jetzt zum Beispiel als Ganzzahl zu konvertieren, gibt es mehrere Varianten. Eine der bekanntesten dürfte diese sein:

<?php
	$zahl = "1";
	var_dump($zahl);
	echo "<br />";
	$zahl = (int) $zahl;
	var_dump($zahl);
?>

Als Ergebnis bekommt man folgendes:

string(1) "1" 
int(1)

Bei der ersten Ausgabe haben wir also noch einen String, in der Zweiten ist es schon eine Zahl. Diesen Vorgang bezeichnet man als Type-Casting. Durch die Nutzung des richtigen Datentypen kann der Speicherverbrauch sinken. Das ist zwar auf dem ersten Blick nicht viel, wenn man es aber in der Masse sieht schon spürbar.

Kommen wir zur zweiten Variante. Durch das Aufrufen von Konvertierungs-Funktionen kann man zusätzliche Parameter, wie zum Beispiel das Zahlensystem, von dem man konvertieren möchte (Octal, Decimal,…). Das Beispiel von gerade sieht dann so aus:

<?php
	$zahl = "1";
	var_dump($zahl);
	echo "<br />";
	$zahl = intval($zahl);
	var_dump($zahl);
?>

Neben intval gibt es auch noch Funktionen für die meisten anderen Datentypen:

  • floatval/doubleval – Konvertieren eine Variable zu float
  • strval – Konvertiert eine Variable zum String
<?php
	$zahl = "1";
	var_dump($zahl);
	echo "<br />";
	settype($zahl,"int");
	var_dump($zahl);
?>

settype liefert ein Boolean zurück, der angibt, ob die Konvertierung erfolgreich war. Die Variable wird dabei per Referenz übergeben.

Zu guter Letzt casted PHP auch selbst, wenn man zum Beispiel eine Berechnung durchführen möchte:

<?php
	$zahl = "1";
	var_dump($zahl);
	echo "<br />";
	$zahl = $zahl * 1;
	var_dump($zahl);
?>

Den aktuellen Datentyp auslesen

Im obigen Beispiel habe ich ja bereits settype erwähnt. Hier gibt es natürlich auch das Gegenstück: gettype:

<?php
	$zahl = 1;
	echo gettype($zahl);
?>

Heraus kommt in diesem Fall „integer“. In der Regel wollen wir aber nicht den Datentyp auslesen, sondern prüfen, ob die Daten in einem bestimmten Typ vorlegen. Auch hierzu gibt es einige Funktionen. Eine davon ist is_int:

<?php
	$zahl = 1;
	if(is_int($zahl))
	{
		echo "Integer!";
	}
?>

Bei is_int kann es leicht zu Verwirrungen kommen. Denn die 1 kann so als Integer, aber auch als Float vorliegen. So wird im folgenden Fall „Kein Integer!“ angezeigt:

<?php
	$zahl = 1.0;
	if(is_int($zahl))
	{
		echo "Integer!";
	}
	else
	{
		echo "Kein Integer!";
	}
?>

Umgekehrt liefert ein Int bei is_float ein false zurück. Mit is_numeric gibt es aber Abhilfe. Es deckt beide Fälle ab:

<?php
	$zahl = 1.0;
	if(is_numeric($zahl))
	{
		echo "Numerisch!";
	}
	else
	{
		echo "Nicht Numerisch!";
	}
?>

Neben den bereits genannten Funktionen gibt es auch noch Folgende:

  • is_array
  • is_bool
  • is_float
  • is_integer
  • is_nan (Not a number)
  • is_null
  • is_object
  • is_resource
  • is_string

empty

Die Funktion empty überprüft in PHP, ob eine Variable leer ist. Leer ist aber eher ein dehnbarer Begriff:

<?php
	$a = null;
	$b = 0;
	$c = "0";
	$d = "";
	$e = false;
	$f = 1;
	if(empty($a)) echo "a<br />";
	if(empty($b)) echo "b<br />";
	if(empty($c)) echo "c<br />";
	if(empty($d)) echo "d<br />";
	if(empty($e)) echo "e<br />";
	if(empty($f)) echo "f<br />";
?>

Es werden die Buchstaben von a-e ausgegeben. Nur f ist befüllt. Wer also eine „0“ erwartet, bekommt trotzdem ein false. Aus diesem Grund ist das eine Funktion, die ich sehr ungern verwende. Die Alternative folgt noch 😉

isset

Eine ähnliche Funktion wie empty ist isset. Sie ist quasi das Gegenteil von is_null und liefert true zurück, wenn eine Variable nicht NULL ist. Das Problem dabei ist, dass man in isset leider keinen Funktionsaufruf übergeben kann. Deswegen nutze ich auch isset mittlerweile ungern.

Typensicher vergleichen

Jetzt wollen wir noch Variablen Typensicher vergleichen. Ein Beispiel:

<?php
	$int = 0;
	$string1 = "";
	$string2 = "0";
	$null = null;
	$false = false;
	if($int == $string1) echo "int == string1<br />";
	if($int === $string1) echo "int === string1<br />";
	if($int == $string2) echo "int == string2<br />";
	if($int === $string2) echo "int === string2<br />";
	if($int == $false) echo "int == false<br />";
	if($int === $false) echo "int === false<br />";
	if($int == $null) echo "int == null<br />";
	if($int === $null) echo "int === null<br />";
	if($string1 == $null) echo "string1 == null<br />";
	if($string1 === $null) echo "string1 == null<br />";
	if($string2 == $null) echo "string2 === null<br />";
	if($string2 === $null) echo "string2 === null<br />";
	if($false == $null) echo "false == null<br />";
	if($false === $null) echo "false === null<br />";
?>

In diesem Fall kommt folgendes dabei heraus:

int == string1
int == string2
int == false
int == null
string1 == null
false == null

Diese Verhaltensweise sollte man sich bewusst sein, wenn man mit 0-Werten zu tun hat. Wenn in einer Spalte zwischen NULL und Null(0) unterschieden wird, ist eine typensichere Überprüfung mit den drei Gleichzeichen lebensnotwendig. Andernfalls bekommt ihr Fehler, nach denen ihr eine lästige Suche tätigen müsst. Das Gegenstück zu === ist übrigens !==.

Fazit

Type-Casting sollte jeder gute Programmierer kennen. Wenn ihr da ein Augenmerk auf die richtigen Typen legt, könnt ihr eure Scripte beschleunigen und tückische Fehler vermeiden.

Das Casting zwischen Objekten habe ich hier einmal herausgelassen, da das Thema etwas größer ist. Ein weiterer Beitrag folgt..

Kommentare

Kevin Geller schrieb am 24.09.2013:

hm, ctype_xxx wäre hier evtl noch interessant den dadurch (er)kennt php auch (string) im lower oder uppercase, sowie hexadezimal und anderes

Tutorial: Erste Schritte mit Facebooks &#8220;Hack&#8221; schrieb am 23.03.2014:

[&#8230;] seit ihr auf dem Weg PHPs größte Stärke und Schwäche aufzulösen &#8211; Der lockere Umgang mit Datentypen. Gerade für Programmier-Anfänger ist PHP geeignet, da man sich nicht mit den Datentypen [&#8230;]