PHP – 値が空かどうか判定するときの落とし穴

変数に格納されている値が空なのかどうか、phpで判定するとき、よく間違える落とし穴があります。
値が空かどうか判定するのに、phpでは主に以下の関数が用意されています。

 

関数 リファレンスの説明
empty() 変数が空であるかどうかを検査する
isset() 変数がセットされていること、そしてNULLでないことを検査する
is_null() 変数がNULLかどうか調べる

 

emptyで調べる

リファレンスにはざっくり「であるかどうかを検査する」とありますが、このの定義をしっかりおさえておかないと想定した動作をしないことに直面します。
リファレンスをもう少し読むと、「変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。」とあるからです。

※つまりif(!$var)と全く同じってこと、empty()いらなくね・・・?って思っちゃうのは私だけでしょうか。。。

実際に以下のようなソースで調べてみます。

//検査する変数の定義
$num = 1;                //数値の1
$zero = 0;               //数値の0
$zero_char = "0";        //文字列の0
$kara;                   //何も代入しない
$kara_char = "";         //空文字
$null = NULL;            //NULL
$init_arr = array();     //配列の初期化
$kara_arr = [ "" => ""]; //空文字が入った配列

//emptyの動作を調べるコード
if(empty($num)){
    print "empty(\$num) 数値の1 : true\n";
}else{
    print "empty(\$num) 数値の1 : false\n";
}
if(empty($zero)){
    print "empty(\$zero) 数値の0 : true\n";
}else{
    print "empty(\$zero) 数値の0 : false\n";
}
if(empty($zero_char)){
    print "empty(\$zero_char) 文字列の0 : true\n";
}else{
    print "empty(\$zero_char) 文字列の0 : false\n";
}
if(empty($kara)){
    print "empty(\$kara) 何も代入しない : true\n";
}else{
    print "empty(\$kara) 何も代入しない : false\n";
}
if(empty($kara_char)){
    print "empty(\$kara_char) 空文字 : true\n";
}else{
    print "empty(\$kara_char) 空文字 : false\n";
}
if(empty($null)){
    print "empty(\$null) NULL : true\n";
}else{
    print "empty(\$null) NULL : false\n";
}
if(empty($init_arr)){
    print "empty(\$init_arr) 配列の初期化 : true\n";
}else{
    print "empty(\$init_arr) 配列の初期化 : false\n";
}
if(empty($num_arr)){
    print "empty(\$kara_arr) 空文字が入った配列 : true\n";
}else{
    print "empty(\$kara_arr) 空文字が入った配列 : false\n";
}

結果は以下のようになります。

empty($num) 数値の1 : false
empty($zero) 数値の0 : true
empty($zero_char) 文字列の0 : true
empty($kara) 何も代入しない : true
empty($kara_char) 空文字 : true
empty($null) NULL : true
empty($init_arr) 配列の初期化 : true
empty($kara_arr) 空文字が入った配列 : true

感覚的にNULLであるとか、何も代入されていない場合にemptyだろ、と思ってしまうこともあるかもしれませんが、空文字が入っていたり、なんなら数値の0であったとしてもemptyはと判断します。

 

最後にempty、isset、is_nullそれぞれでtrueかfalseか調べた結果を載せておきます。

調査結果一覧

 

変数 empty() isset() is_null()
$num = 1; //数値の1 false true false
$zero = 0; //数値の0 true true false
$zero_char = “0”; //文字列の0 true true false
$kara; //何も代入しない true false true
$kara_char = “”; //空文字 true true false
$null = NULL; //NULL true false true
$init_arr = array(); //配列の初期化 true true false
$kara_arr = [ “” => “”]; //空文字が入った配列 true false true

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です