nullとfalseと0と""(空文字)の違い

条件分岐を書いていて時々nullとfalseと0と""(空文字)ってどう区別するんだっけ?
というのが偶にあります。特にフォーム未記入欄のチェック時に。


また関数にも
isset()...変数が空であるかどうかを検査する

empty()...変数がセットされていること、そして NULL でないことを検査する
があり、時々それぞれの値と関数の違いについて区別がつかなくなるときがあります。


まずはそれぞれの値に関数を入れてみてチェックをしてみましょう。


print_r()の場合

<?php 
$value = array(false,null,0,'');
print_r($value);
?>



出力結果

<?php 
Array ( [0] => [1] => [2] => 0 [3] => )
?>

print_r()の場合は0(ゼロ)のみ出力されました。
数値としてこの値のみ認識されました。

empty()の場合

<?php 
$value = array(12,false,null,0,'');
for($i=0; $i<=4; $i++){
var_dump(empty($value[$i]));
echo '<br>';
}
?>



結果

12 = bool(false) 
false = bool(true) 
null = bool(true) 
0 = bool(true) 
'' = bool(true) 

こちらの場合は"12"のみfalseとなりました。
empty()は空かどうかを調べるので最もです。

isset()の場合

<?php 
$value = array(12,false,null,0,'');
for($i=0; $i<=4; $i++){
var_dump(isset($value[$i]));
echo '<br>';
}
?>



結果

12 = bool(true) 
false = bool(true) 
null = bool(false) 
0 = bool(true) 
'' = bool(true) 

こちらの場合はnullのみfalseとなりました。
isset()の方はnull以外は全てtrueとして認識してくれます。


最後に比較演算子でそれぞれの値の関係を調べてみます

$a == $b ... 型はあってなくても値があってる場合。

<table border="1">
<tr>
<?php 
$a = array('12','false','null','0','空文字');
$b = array(12,false,null,0,'');
print '<td>対比</td>';
for($i=0; $i<=4; $i++){
 print '<td style="background: #9E9E9E;">'.$a[$i].'</td>';
}
print '</tr>';
for($i=0; $i<=4; $i++){
 print '<tr>';
 print '<td style="background: #9E9E9E;">'.$a[$i].'</td>';
  
  for($num=0; $num<=4; $num++){
	  
        if($b[$i] == $b[$num]){
		 $ans = '<td style="background:#B9C8F3;">true</td>';
		 }else{
		 $ans = '<td style="background:#CC6C6E;">false</td>';
		 }
   print $ans;
        
   }
   print '</tr>';
}
?>
</table>



結果

対比12falsenull0空文字
12truefalsefalsefalsefalse
falsefalsetruetruetruetrue
nullfalsetruetruetruetrue
0falsetruetruetruetrue
空文字falsetruetruetruetrue
null,false,0,空文字,それぞれは型は違えど全て同じ物として認識されます。

$a === $b ... 型も値があってる場合。

<table border="1">
<tr>
<?php 
$a = array('12','false','null','0','空文字');
$b = array(12,false,null,0,'');
print '<td>対比</td>';
for($i=0; $i<=4; $i++){
 print '<td style="background: #9E9E9E;">'.$a[$i].'</td>';
}
print '</tr>';
for($i=0; $i<=4; $i++){
 print '<tr>';
 print '<td style="background: #9E9E9E;">'.$a[$i].'</td>';
  
  for($num=0; $num<=4; $num++){
	  
        if($b[$i] === $b[$num]){
		 $ans = '<td style="background:#B9C8F3;">true</td>';
		 }else{
		 $ans = '<td style="background:#CC6C6E;">false</td>';
		 }
   print $ans;
        
   }
   print '</tr>';
}
?>
</table>



結果

対比12falsenull0空文字
12truefalsefalsefalsefalse
falsefalsetruefalsefalsefalse
nullfalsefalsetruefalsefalse
0falsefalsefalsetruefalse
空文字falsefalsefalsefalsetrue
同じ値と型のみが綺麗にtrueになってます。