PHPの変数の空やnullのチェック、==演算子による比較がややこしかったのでまとめてみました。
目次
empty(),isset(),is_null(),「!」
empty()
まず、empty()です。
PHPマニュアルによると、
empty 変数が空かどうか判定します。
と説明されます。
この「空かどうか」というのが曖昧で、使い方を誤ってしまうように感じます。
empty()は、0(整数)や”0″(文字列の0)を空と判定します。注意が必要です。
また、空文字列や 空の配列、FALSEの場合も空です。
ちなみに、empty()の引数は変数のみなので、empty(0)などはエラーになります。
empty()がtrueになる値をコードで確認します。
// emptyがtrue
$x = 0;
if (empty($x)) {
echo "empty(\$x) (\$x=0) : true";
} else {
echo "empty(\$x) (\$x=0) : false";
}
$x = "0";
if (empty($x)) {
echo "empty(\$x) (\$x=0) : true";
} else {
echo "empty(\$x) (\$x=0) : false";
}
$x = "";
if (empty($x)) {
echo "empty(\$x) (\$xは空文字列) : true";
} else {
echo "empty(\$x) (\$x空文字列) : false";
}
$x = array();
if (empty($x)) {
echo "empty(\$x) (\$xは配列) : true";
} else {
echo "empty(\$x) (\$xは空の配列) : false";
}
$x = false;
if (empty($x)) {
echo "empty(\$x) (\$x=false) : true";
} else {
echo "empty(\$x) (\$x=false) : false";
}
否定の!と同じ意味
empty()と否定の!に(if(!$x)に突っ込む)同じ値を与えたとき、返されるbool値は同じです。
ただし、if(!$x)の方は未定義の変数であるとNOTICEが出ます。
コードで確認します。
if (!0) {
echo "!0: true";
} else {
echo "!0 : false";
}
if (!"0") {
echo "!\"0\" : true";
} else {
echo "!\"0\" : false";
}
if (!"") {
echo "!\"\" : true";
} else {
echo "!\"\" : false";
}
if (!array()) {
echo "!array() : true";
} else {
echo "!array() : false";
}
if (!false) {
echo "!false : true";
} else {
echo "!false : false";
}
先程のempty()の時と同じ結果になります。
empty()と!が同じ意味をもつことがわかりました。
ということは、
if(!empty($x))と書くのと、if($x)
と書くのは同じ意味です。
empty()の0の扱いがわからなくなった時は、「if()で0や”0″を判定するとfalse」なので、その逆に、「empty()では0や”0″はtrueになる」
と考えると覚えやすい気がします。
isset(),is_null()
PHPマニュアルによると、
isset 変数がセットされていること、そして NULL でないことを検査する
と説明されます。
isset()は、!empty()(空でないことのチェック)と似ている気がしますが、
- 0
- “0”
- “”
- false
では、trueを返します。
empty()ではこれらは空である扱いでしたが、issetではこれらは空でないようです。
issetはNULLでないこと、未定義でないことのみを調べられます。
一方、is_null()は
- 0
- “0”
- “”
- false
もfalseを返します。これら以外の値でもis_null()はisset()の逆の値を返します。
コードで確認します。
// issetと!is_nullの比較
$x = 0;
if (isset($x)) {
echo "isset(\$x) (\$x=0) : true";
} else {
echo "isset(\$x) (\$x=0) : false";
}
if (!is_null($x)) {
echo "!is_null(\$x) (\$x=0) : true";
} else {
echo "!is_null(\$x) (\$x=0) : false";
}
$x = "";
if (isset($x)) {
echo "isset(\$x) (\$xは空文字列) : true";
} else {
echo "isset(\$x) (\$xは空文字列) : false";
}
if (!is_null($x)) {
echo "!is_null(\$x) (\$xは空文字列) : true";
} else {
echo "!is_null(\$x) (\$xは空文字列) : false";
}
$x=null;
if (isset($x)) {
echo "isset(\$x) (\$xはnull) : true";
} else {
echo "isset(\$x) (\$xはnull) : false";
}
if (!is_null($x)) {
echo "!is_null(\$x) (\$xはnull) : true";
} else {
echo "!is_null(\$x) (\$xはnull) : false";
}
== 緩やかな比較
0 == “0”は等しい?
==演算子による比較は緩やかな比較と呼ばれるそうです。
「緩やか」というのは、型(数字と文字列)を区別せず比較するからです。
つまり、
0 == “0” ⇒ true
というように整数と同じ値の文字列は等しい扱いです。
この時、文字列が数値に変換されてます。
0は空?
empty()の時と似ていますが、
数値の0は””、NULL、FALSEと等しい扱いです。
- 0 == “” ⇒ true
- 0 == FALSE ⇒ true
- 0 == NULL ⇒ true
“0”は空ではない?
“0”は0とFALSEとは等しい扱いですが、””、NULLとの比較ではfalseを返します。
empty()では”0″も””も空であったのに対し、==による比較では、“0”==””でないので注意が必要です。
- “0” == FALSE ⇒ true
- “0” == 0 ⇒ true
- “0” == NULL ⇒ false
- “0” == “” ⇒ false
“abc”は0?
いきなりコードで確認します。
if ("abc" == 0) {
echo "\"abc\" == 0 ⇒ true";
} else {
echo "\"abc\" == 0 ⇒ false";
}
結果は
“abc” == 0 ⇒ true
です。
これは文字列”abc”が0に変換され比較されるからです。
これも、文字列をint型に型変換する時のルールによるものです。
ちなみに、switch文の条件比較にも内部的に「==」が使われています。
=== 厳密な比較
===による比較は厳密な比較と呼ばれます。
変換が行われないので、まったく同じものでないと等しいと扱われません。
0 === “0” ⇒ false
であり、
“abc” === 0 ⇒ false
です。
文字列が数値に変換され比較されてしまうと困るところでは
===を使う方が安全だと思います。
まとめ
最初はPHP型の比較表を見たときわけがわからなかったですが、何度も凝視しながら自分でまとめてみたことで勉強になりました。