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"