PHP: Prüfen auf Leerheit/Undefiniertheit

Wenn man mit PHP in verschiedenen Umgebungen arbeitet, in denen "leer" bzw. "nicht gesetzt" jeweils verschiedene Dinge bedeuten, übersieht man dank PHPs type juggling schonmal, was bei einem Vergleich herauskommt. Die folgende Tabelle kann helfen:

== 0 "" "0" "a1" "1a"
0 true true true true false
"" true true false false false
"0" true false true false false
true false false false true true
false true true true false false
null* true true false false false

* isset($a) hingegen ist immer true, auch wenn $a = "";

 

Es bietet sich an, die linke Spalte als Referenz und die obere Zeile als Probe zu verwenden. Wenn also

if ($a == "0" || $a == "")

im Code steht, dann oder-verknüpfe ich Zeile 1 und Zeile 2 und weiß: Diese Bedingung ist erfüllt wenn $a einen den Werte 0, "" oder "0" hat und ist nicht erfüllt, wenn $a den Wert "a1" oder "1a" hat.

Ich sehe außerdem (in der zweitletzten Zeile), daß ich dafür auch einfach if ($a) hätte schreiben können, was schließlich das gleiche ist wie if ($a == true).


 

Ein thematisch verwandtes Caveat: Während isset($a) und ($a !== null) in der Regel gleichbedeutend sind, sind es unset($a) und $a = null nicht:

$a = $b = array('x' => 'foo', 'y' => 'bar'); unset($a['x']); $b['x'] = null; foreach ($a as $value) var_dump($value); echo '-'.LF; foreach ($b as $value) var_dump($value);

Ergibt:

string(3) "bar"
-
NULL
string(3) "bar"