PHP 5: Unterschied zwischen den Funktionen empty(), isset() und is_null
Augenscheinlich sind diese Funktionen recht ähnlich, richtig benutzt lassen sich viele Probleme vermeiden.
Allgemeines zu isset(), empty() und is_null()
Diese drei Funktionen prüfen auf unterschiedliche Eigenschaften der Variable. Dies bedeutet, dass in negierten Kontrollstrukturen (Ausrufezeichen) natürlich auch auf diese unterschiedlichen Eigenschaften geprüft wird.
Deutlich wir dies an den folgenden drei Beispielen:
1. Einfache Kontrollstruktur
<?php
error_reporting(E_ALL);
if (5 == $i) {
print "\$i ist 5\n";
}
else {
print "\$i ist ungleich 5\n";
}
?>
Ausgabe:
Notice: Undefined variable: i in test.php on line 3 $i ist ungleich 5
2. Einfache Kontrollstruktur ohne Warnung
Um diese Warnung nicht mehr zu erhalten muss man vorher prüfen, ob $i überhaupt schon definiert wurde:
<?php
error_reporting(E_ALL);
if (isset($i) and 5 == $i) {
print "\$i ist 5\n";
}
else {
print "\$i ist ungleich 5\n";
}
?>
Ausgabe:
$i ist ungleich 5
3. Einfache Kontrollstruktur ohne Warnung die auf irgendeinen Wert prüft
Möchte man einfach nur prüfen, ob einer Variablen ein Wert zugewiesen wurde, dann sollte man dies mit !empty() tun:
<?php
error_reporting(E_ALL);
# Nur der zweiten Variable einen Wert zuweisen
$i2 = 3;
# Erste nicht existierende Variable pruefen
if (!empty($i1)) {
print "\$i1 ist ein Wert zugewiesen\n";
}
else {
print "\$i1 existiert nicht oder es wurde kein Wert zugewiesen\n";
}
# Zweite Variable pruefen
if (!empty($i2)) {
print "\$i2 ist ein Wert zugewiesen\n";
}
else {
print "\$i2 existiert nicht oder es wurde kein Wert zugewiesen\n";
}
?>
Ausgabe:
$i1 existiert nicht oder es wurde kein Wert zugewiesen $i2 ist ein Wert zugewiesen
Einschub: kurze Schreibweise:
Statt der ausführlichen If-Anweisung in den letzten Beispielen kann man auch die folgende kurze Schreibweise verwenden. Der Code
<?php
if (!empty($i1)) {
print "\$i1 ist ein Wert zugewiesen\n";
}
else {
print "\$i1 existiert nicht oder es wurde kein Wert zugewiesen\n";
}
?>
Führt zum gleichen Resultat wie
<?php
print (!empty($i1)) ? "\$i1 ist ein Wert zugewiesen\n" : "\$i1 existiert nicht oder es wurde kein Wert zugewiesen\n";
?>
Funktion isset()
Die Funktion isset() liefert TRUE zurück, wenn die zu überprüfende Variable initialisiert wurde. Der Rückgabewert ist auch TRUE, wenn die Variable mit einem Leerstring, der Zahl Null oder FALSE initialisiert wurde. Beispiele:
<?php
// $x0 wird nicht initialisiert
$x1 = NULL;
$x2 = FALSE;
$x3 = "";
$x4 = "Hello World";
$x5 = TRUE;
$x6 = foobar;
$x7 = array();
$x8 = array("foo");
$x9 = "0";
$x10 = new stdClass();
print (isset($x0)) ? "\$x0 ist SET\n" : "\$x0 ist nicht SET\n";
print (isset($x1)) ? "\$x1 ist SET\n" : "\$x1 ist nicht SET\n";
print (isset($x2)) ? "\$x2 ist SET\n" : "\$x2 ist nicht SET\n";
print (isset($x3)) ? "\$x3 ist SET\n" : "\$x3 ist nicht SET\n";
print (isset($x4)) ? "\$x4 ist SET\n" : "\$x4 ist nicht SET\n";
print (isset($x5)) ? "\$x5 ist SET\n" : "\$x5 ist nicht SET\n";
print (isset($x6)) ? "\$x6 ist SET\n" : "\$x6 ist nicht SET\n";
print (isset($x7)) ? "\$x7 ist SET\n" : "\$x7 ist nicht SET\n";
print (isset($x8)) ? "\$x8 ist SET\n" : "\$x8 ist nicht SET\n";
print (isset($x9)) ? "\$x9 ist SET\n" : "\$x9 ist nicht SET\n";
print (isset($x10)) ? "\$x10 ist SET\n" : "\$x10 ist nicht SET\n";
?>
Ausgabe:
$x0 ist nicht SET $x1 ist nicht SET $x2 ist SET $x3 ist SET $x4 ist SET $x5 ist SET $x6 ist SET $x7 ist SET $x8 ist SET $x9 ist SET $x10 ist SET
Funktion empty()
Die Funktion empty() liefert TRUE zurück, wenn eine Variable nicht definiert ist oder mit einem Leerstring oder der Zahl Null definiert wurde. Beispiele:
<?php
// $x0 wird nicht initialisiert
$x1 = NULL;
$x2 = FALSE;
$x3 = "";
$x4 = "Hello World";
$x5 = TRUE;
$x6 = foobar;
$x7 = array();
$x8 = array("foo");
$x9 = "0";
$x10 = new stdClass();
print (empty($x0)) ? "\$x0 ist EMPTY\n" : "\$x0 ist nicht EMPTY\n";
print (empty($x1)) ? "\$x1 ist EMPTY\n" : "\$x1 ist nicht EMPTY\n";
print (empty($x2)) ? "\$x2 ist EMPTY\n" : "\$x2 ist nicht EMPTY\n";
print (empty($x3)) ? "\$x3 ist EMPTY\n" : "\$x3 ist nicht EMPTY\n";
print (empty($x4)) ? "\$x4 ist EMPTY\n" : "\$x4 ist nicht EMPTY\n";
print (empty($x5)) ? "\$x5 ist EMPTY\n" : "\$x5 ist nicht EMPTY\n";
print (empty($x6)) ? "\$x6 ist EMPTY\n" : "\$x6 ist nicht EMPTY\n";
print (empty($x7)) ? "\$x7 ist EMPTY\n" : "\$x7 ist nicht EMPTY\n";
print (empty($x8)) ? "\$x8 ist EMPTY\n" : "\$x8 ist nicht EMPTY\n";
print (empty($x9)) ? "\$x9 ist EMPTY\n" : "\$x9 ist nicht EMPTY\n";
print (empty($x10)) ? "\$x10 ist EMPTY\n" : "\$x10 ist nicht EMPTY\n";
?>
Ausgabe:
$x0 ist EMPTY $x1 ist EMPTY $x2 ist EMPTY $x3 ist EMPTY $x4 ist nicht EMPTY $x5 ist nicht EMPTY $x6 ist nicht EMPTY $x7 ist EMPTY $x8 ist nicht EMPTY $x9 ist EMPTY $x10 ist nicht EMPTY
Auf drei Fälle muss man aufpassen:
empty() beim Vergleich von Strings
Je nach Quelle kann der Integer-Wert 0 (Null) auch als String "0" definiert sein. In diesem Fall ist ist empty() nicht wahr (siehe $x9). Abhilfe schafft hier nur die vorherige Konvertierung mittels (int) oder intval().
empty() bei Objekten unter verschiedenen PHP-Versionen
Zwar das Standard-Objekt $x10 nicht EMPTY, dies aber nur bei PHP-Versionen größer gleich 5.X. Unter PHP4 wäre der Ausdruck true.
empty() bei Arrays
Ein leeres Array ist EMPTY.
Zur Überprüfung von Arrays gibt es andere Funktion, zu erwähnen sei hier
<?php
$x1 = array();
$x2 = array(1, 2, 3);
$x3 = 3;
if (is_array($x1)) {
print "\$x1 ist ein Array\n";
if (count($x1)) {
print "\$x1 enthält Werte\n";
}
}
else {
print "\$x1 ist kein Array\n";
}
if (is_array($x2)) {
print "\$x2 ist ein Array\n";
if (count($x2)) {
print "\$x2 enthält Werte\n";
}
}
else {
print "\$x2 ist kein Array\n";
}
if (is_array($x3)) {
print "\$x3 ist ein Array\n";
if (count($x3)) {
print "\$x3 enthält Werte\n";
}
}
else {
print "\$x3 ist kein Array\n";
}
?>
Ausgabe:
$x1 ist ein Array $x2 ist ein Array $x2 enthält Werte $x3 ist kein Array
Die Funktion is_null()
Die Funktion is_null() liefert nur dann TRUE, wenn eine Variable NULL ist, bzw. noch nicht initialisiert wurde.
<?php
// $x0 wird nicht initialisiert
$x1 = NULL;
$x2 = FALSE;
$x3 = "";
$x4 = "Hello World";
$x5 = TRUE;
$x6 = 0;
$x6 = foobar;
$x7 = array();
$x8 = array("foo");
$x9 = "0";
$x10 = new stdClass();
print (is_null($x0)) ? "\$x0 ist NULL\n" : "\$x0 ist nicht NULL\n";
print (is_null($x1)) ? "\$x1 ist NULL\n" : "\$x1 ist nicht NULL\n";
print (is_null($x2)) ? "\$x2 ist NULL\n" : "\$x2 ist nicht NULL\n";
print (is_null($x3)) ? "\$x3 ist NULL\n" : "\$x3 ist nicht NULL\n";
print (is_null($x4)) ? "\$x4 ist NULL\n" : "\$x4 ist nicht NULL\n";
print (is_null($x5)) ? "\$x5 ist NULL\n" : "\$x5 ist nicht NULL\n";
print (is_null($x6)) ? "\$x6 ist NULL\n" : "\$x6 ist nicht NULL\n";
print (is_null($x7)) ? "\$x7 ist NULL\n" : "\$x7 ist nicht NULL\n";
print (is_null($x8)) ? "\$x8 ist NULL\n" : "\$x8 ist nicht NULL\n";
print (is_null($x9)) ? "\$x9 ist NULL\n" : "\$x9 ist nicht NULL\n";
print (is_null($x10)) ? "\$x10 ist NULL\n" : "\$x10 ist nicht NULL\n";
?>
Ausgabe:
$x0 ist NULL $x1 ist NULL $x2 ist nicht NULL $x3 ist nicht NULL $x4 ist nicht NULL $x5 ist nicht NULL $x6 ist nicht NULL $x7 ist nicht NULL $x8 ist nicht NULL $x9 ist nicht NULL $x10 ist nicht NULL
Kommentare
MF (nicht überprüft)
2. Juli 2014 - 11:31
Permanenter Link
Leeres Array = EMPTY!
Leeres Array = EMPTY!
Natürlich wird ein leeres Array als EMPTY angezeigt, wie man auch im obigen Beispiel bei
empty($x7);
sehen kann.count()
sollte nur verwendet werden, wenn man die Anzahl der Elemente des Arrays wissen möchte.Die Verwendung von
count()
kann z.B. zu Problemen führen, wenn man sie auf das Resultat einer Funktion anwendet, die einen Array oder FALSE im Fehlerfall zurückgibt, denn es istempty(FALSE)=TRUE
, abercount(FALSE)=1
, wird also als nichtleer angezeigt.stefan
2. Dezember 2014 - 16:54
Permanenter Link
Das stimmt natürlich, da
Das stimmt natürlich, da hatte sich ein Dreher beim Schreiben eingeschlichen.
count() benutze ich immer zusammen mit is_array(), beispielsweise
<?php
// getValue returns FALSE or array
$foo = getValue();
if (FALSE === is_array($foo) || 0 == count($foo)) {
$foo = array('default', 'values');
}
?>