PHPでの空値の扱い〜issetとemptyを比較する
PHPでは、NULLやundefinedや空文字(''のこと)や0や'0'が空値扱いされたりされなかったりする。
他の言語ではこれらを
Java if (hoge == null || hoge.equals("")) { // 空文字かどうか ..... if (hoge == 0) { // 0かどうか ..... if (!hoge) { // falseかどうか .....
と書いた場合は全て違うわけだが(その前にJavaの場合は変数の型が決まっているので、上記を全て満たすhogeは記述できないが)、PHPでは、これが記述できてしまう。更に、その時の条件による挙動があいまいに感じる。
そこで、PHPでは上記のような等号/不等号による判断をなるべく避けて、isset()/empty()を使うのが良いのではないだろうか。
- isset() あるかどうか
- empty() 無いかどうか
よって、比べるにはisset()と!empty()としなければならないが、これを比べる簡単なプログラムを書いてみた。結果は次のとおりである。
: isset() : !empty()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
最後の「$hoge_back=0a」は、下のプログラムを見ていただきたい。unset()で変数をクリアしても、実体は残っている、という確認だ。
この結果を見ると、isset()とempty()のそれぞれが何を見ているのかが分かってくる。
isset()では、変数が指す先がNULLかどうかを見ているようだ。変数の先(変数に直接格納された、実体としての値が格納された領域へのアドレス)が0(NULL)かどうかをチェックし、何らかの実体を指している場合はtrueが返却される。その際、指している実体が0かどうかは問題ではない。
empty()は、isset()で確認される、その変数が指している実体があり、かつ、その実体が「0」と扱われるかどうか、を判断しているようだ。
以下に、この結果を表示するための簡単なプログラムを示す。
<?php echo ' : isset() : !empty()' . "\n"; echo '-----------------------------' . "\n"; echo '未定義 : '; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo 'NULL : '; $hoge = null; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo 'FALSE : '; $hoge = FALSE; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo '空文字 : '; $hoge = ''; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo '空配列 : '; $hoge = array(); if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo '0 : '; $hoge = 0; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo '\'0\' : '; $hoge = '0'; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo '\'0a\' : '; $hoge = '0a'; if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo 'unset後 : '; $hoge_back = $hoge; unset($hoge); if (isset($hoge)) { echo ' TRUE '; } else { echo ' FALSE'; } echo ' : '; if (!empty($hoge)) { echo ' TRUE '; } else { echo ' FALSE '; } if (isset($hoge) == (!empty($hoge))) { echo ' 一致 '; } else { echo ' 不一致'; } echo "\n"; echo "\n" . '$hoge_back=' . $hoge_back . "\n";