読者です 読者をやめる 読者になる 読者になる

WebEngine

web、プログラミング関係について書いていきます。あなたの優しい眼差しがブログの成長につながりますのでどうぞよろしく。

emptyとisset

php

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以外にも変数チェック の手法がありますが、それらの情報も得られるでしょう。

広告を非表示にする