WebEngine

だらだらと綴る技術系メモ

emptyとisset

emptyとissetの違い

※ここに書いてあるのは、PHP5以上のバージョン話になります。 過去のバージョンでは仕様が若干違うようです。

empty -> 変数が空かチェックする
isset -> 変数がセットされているかチェックする

この2つ、よく使うわりにバグの温床になりやすいんですよねえ。 僕は忘れっぽいので、しょっちゅう調べています。

emptyが空だと判断する値

変数のなかに、次の値が入っている場合、emptyはtrueを返します。

  1. "" (空文字列)
  2. 0 (整数の0)
  3. 0.0 (浮動小数点数の0)
  4. "0" (文字列の0)
  5. null
  6. false
  7. array(), [] (空の配列)
  8. $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以外にも変数チェック の手法がありますが、それらの情報も得られるでしょう。