【转载@按】
关于PHP的空判断,一共有4种方式,empty(),is_set(),is_null(),if(boolean)。
如果不搞清楚个中含义的话,很可能在编码时留下隐患。
原文是日语的,收藏用。http://blog.promob.jp/fri/2009/01/php-1.html
【原文】
<?
// 配列
$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と判定されてしまったからなのです。
それでは、この部分を修正することになりますが、どのように修正すればいいの
でしょうか?
続きはまた来週です