emptyとisset
emptyとissetの違い
※ここに書いてあるのは、PHP5以上のバージョン話になります。 過去のバージョンでは仕様が若干違うようです。
empty -> 変数が空かチェックする
isset -> 変数がセットされているかチェックする
この2つ、よく使うわりにバグの温床になりやすいんですよねえ。 僕は忘れっぽいので、しょっちゅう調べています。
emptyが空だと判断する値
変数のなかに、次の値が入っている場合、emptyはtrueを返します。
- "" (空文字列)
- 0 (整数の0)
- 0.0 (浮動小数点数の0)
- "0" (文字列の0)
- null
- false
- array(), [] (空の配列)
- $var; (変数が宣言だけされて、値が設定されていない場合)
2、3はコンピュータそのものが、
true==1、false==0の2進数で動いていることを考えればわかりやすい
はずです。実際書籍で、while(1)なんて書いて無限ループをつくっているコード
を見たことがあります。(筆者は可読性よりもコードの短さを優先するタイプだったのかなあ)
しかし、4は意外ですね。文字列でも認識されるとは・・・。これは将来的に仕様が変わるかも
しれません。
そして、重要なのが、issetでは0はtureを返す、ということです。なので、文字列を
格納する変数を扱う場合、emptyではなくissetを使用する方が安全でしょう。
!emptyとisset比較
実際にプログラムを実装するとき、値を調べるのにはemptyというよりは、!emptyを使うかissetを使うかで 迷うケースが多いと思います。なので、その表示結果をコードにしました。
コード
<?php $str = ''; $num = 0; $fnum = 0.0; $strnum = '0'; $n = null; $flag = false; $ary = array(); $sengen; echo '--isset仕様--<br>'; if (isset($str)) { echo 'isset(空文字列) -> true<br>'; } else { echo 'isset(空文字列) -> false<br>'; } if (isset($num)) { echo 'isset(0) -> true<br>'; } else { echo 'isset(0) -> false<br>'; } if (isset($fnum)) { echo 'isset(0.0) -> true<br>'; } else { echo 'isset(0.0) -> false<br>'; } if (isset($strnum)) { echo 'isset("0") -> true<br>'; } else { echo 'isset("0") -> false<br>'; } if (isset($n)) { echo 'isset(null) -> true<br>'; } else { echo 'isset(null) -> false<br>'; } if (isset($flag)) { echo 'isset(false) -> true<br>'; } else { echo 'isset(false) -> false<br>'; } if (isset($ary)) { echo 'isset(空配列) -> true<br>'; } else { echo 'isset(空配列) -> false<br>'; } if (isset($sengen)) { echo 'isset(宣言だけした変数) -> true<br>'; } else { echo 'isset(宣言だけした変数) -> false<br>'; } echo '<br>--!empty仕様--<br>'; if (!empty($str)) { echo '!empty(空文字列) -> true<br>'; } else { echo '!empty(空文字列) -> false<br>'; } if (!empty($num)) { echo '!empty(0) -> true<br>'; } else { echo '!empty(0) -> false<br>'; } if (!empty($fnum)) { echo '!empty(0.0) -> true<br>'; } else { echo '!empty(0.0) -> false<br>'; } if (!empty($strnum)) { echo '!empty("0") -> true<br>'; } else { echo '!empty("0") -> false<br>'; } if (!empty($n)) { echo '!empty(null) -> true<br>'; } else { echo '!empty(null) -> false<br>'; } if (!empty($flag)) { echo '!empty(false) -> true<br>'; } else { echo '!empty(false) -> false<br>'; } if (!empty($ary)) { echo '!empty(空配列) -> true<br>'; } else { echo '!empty(空配列) -> false<br>'; } if (!empty($sengen)) { echo '!empty(宣言だけした変数) -> true<br>'; } else { echo '!empty(宣言だけした変数) -> false<br>'; } ?>
表示結果
--isset仕様-- isset(空文字列) -> true isset(0) -> true isset(0.0) -> true isset("0") -> true isset(null) -> false isset(false) -> true isset(空配列) -> true isset(宣言だけした変数) -> false --empty仕様-- !empty(空文字列) -> false !empty(0) -> false !empty(0.0) -> false !empty("0") -> false !empty(null) -> false !empty(false) -> false !empty(空配列) -> false !empty(宣言だけした変数) -> false
!emptyは「空じゃない」ってことですから、falseが返って きているものは空ということですね。
ここまで結構だらだらと書きましたが、PHPマニュアルに詳細が載っているので、 そちらを参照するのが早いと思います。isset、empty以外にも変数チェック の手法がありますが、それらの情報も得られるでしょう。