プログラミングゆるめモ

プログラミングに関することをゆるくメモしてます

PHP

PHP 変数が空であるかの判断方法 empty()/isset()/is_null()/if($var==

 PHPにおいて、変数が空であるか、空以外であるかを判断するのはちょっとやっかいです。
PHPでは、関数により下記の状態を区別したり、区別しなかったりします。
[A]$var;  (値が未定義)
[B]$var=0; (整数 0)
[C]$var="0"; (文字列 0)
[D]$var=""; (空文字列)
[E]$var=NULL; (ヌル)
[F]$var=FALSE; (偽)
[G]$var=array(); (空配列)
[H]$var=0.0; (浮動小数点数 0)

empty() 関数:変数が空であるかどうかを検査する
空であるかどうかを検査する関数ですが、上記[A]~[H]すべてにおいて空であると判断されます。
[A]~[H]すべてにおいて、TRUEを返します。
つまり、empty()では空("")と0や"0"を区別することができません。

isset() 関数:変数がセットされていること、そして NULL でないことを検査する
[A]値が未定義 [E] NULL にて、FALSEを返します。
[B][C][D][F][G][H] TRUEを返します。
この関数でも、空("")と0や"0"を区別することができません。

is_null() 関数:変数が NULL かどうか調べる
この関数は、isset() とは逆にNULLであればTRUEです。
[A][E] TRUEを返します。
[B][C][D][F][G][H] FALSEを返します。

では次にif文で判断する場合はどうなるでしょうか
if($var==0) この場合は、
[G]のみFALSEとなります。空白("")や"0"と区別してくれません。

if($var===0) この場合は、
[B]のみTRUEとなります。0であるかを厳密に判断するには、===を使います。
[A][C][D][E][F][G][H] FALSE

if($var=="") この場合は、
[C][G] FALSE
[A][B][D][E][F][H] TRUE

if($var==="") この場合は、
[D] TRUE
[A][B][C][E][F][F][H] FALSE

とても、ややこやしいですね。
どのような条件で、空("")であったり、0であったり、"0"であるかを区別するかしないかをちゃんと
考えて適切な条件判断を行わなないと、意図した結果が得られないので要注意です。

-PHP