PHP空判断empty(),is_set(),is_null(),if(boolean)的区别

来源:互联网 发布:ajax跨域访问json数据 编辑:程序博客网 时间:2024/04/23 14:55

【转载@按】

关于PHP的空判断,一共有4种方式,empty(),is_set(),is_null(),if(boolean)。

如果不搞清楚个中含义的话,很可能在编码时留下隐患。

 

原文是日语的,收藏用。http://blog.promob.jp/fri/2009/01/php-1.html

 

【原文】

 

昨日、PHPで次のパターンでプログラムを作っていたら・・・

<?

// 配列
$data = array("サーバー", "プリンタ", "パソコン", "ハードディスク");

// 検索対象キーワード
$findMe = "サーバー";

// 配列からキーワードを検索
$key = array_search($findMe, $data);

// 見つかった場合は配列のキーを返す
if ( $key ){

    echo("見つかりました");

} else {

    echo("見つかりませんでした");

}
?>

とんちんかんな結果が・・・

これを実行すると、PHPが分かる方は分かるかと思いますが・・・。


<実行結果>

見つかりませんでした



という結果になります。

PHP以外の言語を扱っていると、配列の最初にサーバーがあるのに、なぜ?とい
うことになります。

ということで、今日はPHPの空判定についてです。

使い方を間違えるととんでもないことに・・・。

PHPには、空判定する方法は4つあります。

empty()関数を使う、is_null()関数を使う、isset()関数を使う、(bool)を使う

それぞれ、挙動が異なります。

次のプログラムを実行してみます。
クラスがあるのにfunctionがないですが、空のvar定数の挙動を調べるために作
りました。

<?

// nullCheckクラス
class nullCheck {

    var $string;

}

// nullCheckオブジェクトの作成
$nullCheck = new nullCheck();

// nullCheckクラス内の定数をセット
$nullCheckString = $nullCheck->string;

// 文字配列の作成
$stringData = array();

$stringData[1] = "あいうえお";
$stringData[2] = 123457890;
$stringData[3] = "";
$stringData[4] = null;
$stringData[5] = false;
$stringData[6] = "false";
$stringData[7] = 0;
$stringData[8] = "0";

// 空文字判定
for ( $i = 0; $i < 9; $i++ ){

    // 初回はオブジェクト定数、それ以外は配列のデータ
    if ( $i === 0 ){

        $string = $nullCheckString;

    } else {

        $string = $stringData[$i];
        
    }

    echo($i."の結果です。<br>");

    // empty関数で空文字判定
    if ( empty( $string ) ){

        echo("empty():からです。<br>");

    } elseif ( !empty( $string ) ){
       
        echo("not empty():からではありません<br>");
       
    }

    // is_null関数で空文字判定
    if ( is_null( $string ) ){

        echo("is_null():nullです。<br>");

    } elseif( !is_null( $string ) ){
       
        echo("not is_null():nullではありません。<br>");

    }

    // isSet関数で空文字判定
    if ( isset( $string ) ){

        echo("isSet():セットされています。<br>");

    } elseif ( !isset( $string ) ){

        echo("not isSet():セットされていません。<br>");

    }

    // booleanで空文字判定
    if ( $string ){

        echo("TrueOrFalse:TRUEです。<br>");

    } elseif ( !$string ){

        echo("TrueOrFalse:FALSEです。<br>");

    }

   
    echo("<br><br>");

}
?>



結果はこうなります。

<実行結果>

0の結果です。
empty():からです。
is_null():nullです。
not isSet():セットされていません。
TrueOrFalse:FALSEです。


1の結果です。
not empty():からではありません
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:TRUEです。


2の結果です。
not empty():からではありません
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:TRUEです。


3の結果です。
empty():からです。
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:FALSEです。


4の結果です。
empty():からです。
is_null():nullです。
not isSet():セットされていません。
TrueOrFalse:FALSEです。


5の結果です。
empty():からです。
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:FALSEです。


6の結果です。
not empty():からではありません
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:TRUEです。


7の結果です。
empty():からです。
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:FALSEです。


8の結果です。
empty():からです。
not is_null():nullではありません。
isSet():セットされています。
TrueOrFalse:FALSEです。



まずは、1番目と2番目から、それぞれ文字、数字が入っているので、4つの関数
ですべてで空ではありません。

0番目(var定数の空)と4番目の結果(null)も4つの関数すべて空と判定されます。

問題はそれ以外です。

3番目の""、5番目のfalse、6番目の"false"、7番目の0、8番目の"0"は、isset関
数ではTRUEを返してしまいます。

文字列だからこのように初期化して・・・

$a = "";

if ( isset( $a ) ){
   
}


と書いてしまうと、後々頭を抱えることになりかねません。

isset()関数は、null以外はすべてTRUEとなります。

もうひとつ、booleanで空判定した場合も注意が必要です。

7番目の0、8番目の"0"のTrueOrFalseがfalseとなっています。

$a = "0";

if ( $a ){

} else {

}


0という値が入った状態で、if文を作ると、elseのほうに入ってしまいます。

これもやっかいです。

単純にboolean比較すると、nullも0も"0"もfalseも同じになります。

紛らわしいので、4つの関数はこのように覚えます。

1つめは、is_null() → !isset()

is_null()関数は、nullかどうかを判定する関数。nullの場合のみTRUE、その他
はFALSEになります。
isset()関数は反対で、nullの場合はFALSE、その他はTRUEになるのでこのような
関係になります。

2つめは、booleanのtrue → !empty()

単純にboolean比較をすると、null、空文字、0の数字と文字がFALSE、あとは
TRUEとなります。
empty()関数は、null、空文字、0の数字と文字がTRUE、あとはFALSEとなります。

それでは、最初の例に戻ります。

サーバーがなぜ見つからないのか・・・。

それは、サーバーが配列の最初の0番にあたるところに入っているため、$keyが0
を返しており・・・。

0はboolean比較ではFALSEと判定されてしまったからなのです。

それでは、この部分を修正することになりますが、どのように修正すればいいの
でしょうか?

続きはまた来週です

原创粉丝点击