変数に値が入っているかどうかをチェックするのにはissetもしくはemptyを使う。両方とも似たような関数だけど動作は大きく異なるので、(少なくとも僕の場合)これらの関数を混同させたコードを書くのは非常に危険だ。
だもんで、ちょっとまとめてみる。
■コード
<?php
$data[0] = 'string'; #文字列
$data[1] = ''; #空文字列
$data[2] = '0'; # 文字列の0
$data[3] = 0; # 数値の0
$data[4] = false; # BOOL
$data[5] = null;
echo "<pre>";
foreach ($data as $key => $value) {
echo "array[{$key}]=";
var_dump($value);
echo "\n■isset■\n";
if (isset($value)) {
echo "「{$value}」がセットされています(true)";
} else {
echo "セットされていません(false)";
}
echo "\n■!empty■\n";
if (!empty($value)) {
echo "「{$value}」がセットされています(true)";
} else {
echo "セットされていません(false)";
}
echo "<hr>";
}
echo "</pre>";
?>
■結果
array[0]=string(6) "string"
■isset■
「string」がセットされています(true)
■!empty■
「string」がセットされています(true)
-----------------------------
array[1]=string(0) ""
■isset■
「」がセットされています(true)
■!empty■
セットされていません(false)
-----------------------------
array[2]=string(1) "0"
■isset■
「0」がセットされています(true)
■!empty■
セットされていません(false)
-----------------------------
array[3]=int(0)
■isset■
「0」がセットされています(true)
■!empty■
セットされていません(false)
-----------------------------
array[4]=bool(false)
■isset■
「」がセットされています(true)
■!empty■
セットされていません(false)
-----------------------------
array[5]=NULL
■isset■
セットされていません(false)
■!empty■
セットされていません(false)
-----------------------------
「空文字の''」と「数字の0」と「文字列の'0'」と「bool値」での返り値が大きく異なるのがわかる。emptyは広義での「false」を調べるのに対し、issetは狭義での「true」かどうかをチェックする感じだろうか。emptyを使うと潜在的なバグを含んでしまいそうで怖いなあ。
なもんで、変数に何か文字列が入ってる(空文字の''以外)のかどうかをチェックしたいのだったら
if (isset($param) && $param!='') {
~
}
変数に何か数値が入ってる(数値の0以外)のかどうかをチェックしたいのだったら
if (isset($param) && $param!=0) {
~
}
とか決めておいた方がよさそうだ。