変数に格納されている値が空なのかどうか、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 |