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 (
== $i) {
        print 
"\$i ist 5\n";
}
else {
  print 
"\$i ist ungleich 5\n";
}
?>

Ausgabe:

  1. Notice: Undefined variable: i in test.php on line 3
  2. $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 == $i) {
        print 
"\$i ist 5\n";
}
else {
        print 
"\$i ist ungleich 5\n";
}
?>

Ausgabe:

  1. $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:

  1.  
  2. $i1 existiert nicht oder es wurde kein Wert zugewiesen
  3. $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:

  1. $x0 ist nicht SET
  2. $x1 ist nicht SET
  3. $x2 ist SET
  4. $x3 ist SET
  5. $x4 ist SET
  6. $x5 ist SET
  7. $x6 ist SET
  8. $x7 ist SET
  9. $x8 ist SET
  10. $x9 ist SET
  11. $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:

  1. $x0 ist EMPTY
  2. $x1 ist EMPTY
  3. $x2 ist EMPTY
  4. $x3 ist EMPTY
  5. $x4 ist nicht EMPTY
  6. $x5 ist nicht EMPTY
  7. $x6 ist nicht EMPTY
  8. $x7 ist EMPTY
  9. $x8 ist nicht EMPTY
  10. $x9 ist EMPTY
  11. $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(123);
$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:

  1. $x1 ist ein Array
  2. $x2 ist ein Array
  3. $x2 enthält Werte
  4. $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:

  1. $x0 ist NULL
  2. $x1 ist NULL
  3. $x2 ist nicht NULL
  4. $x3 ist nicht NULL
  5. $x4 ist nicht NULL
  6. $x5 ist nicht NULL
  7. $x6 ist nicht NULL
  8. $x7 ist nicht NULL
  9. $x8 ist nicht NULL
  10. $x9 ist nicht NULL
  11. $x10 ist nicht NULL

Kommentare

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 ist empty(FALSE)=TRUE, aber count(FALSE)=1, wird also als nichtleer angezeigt.

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');
}
?>