• WEB

PHPの「0」とか「空」とか

PHPの「0」とか「空」とか

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型の比較表を見たときわけがわからなかったですが、何度も凝視しながら自分でまとめてみたことで勉強になりました。

まーしーが最近書いた記事

WRITERS POSTS もっと見る