PHPの論理値について



PHPの改修を行っていると時々if文の中に値だけって時があります。
この値が何の時にtureで何の時にfalseになるのかの説明です。

↓のようなコードの時ですね。
if($value){
	echo "true";
}

falseの条件

下記がfalseになる条件。
  • boolean の FALSE
  • integer の 0 (ゼロ)
  • float の 0.0 (ゼロ)
  • 空の文字列、 および文字列の “0”
  • 要素の数がゼロである 配列
  • メンバ変数の数がゼロである オブジェクト (PHP 4のみ)
  • 特別な値 NULL (値がセットされていない変数を含む)
  • 空のタグから作成された SimpleXML オブジェクト

※その他の値は全て TRUE とみなされます (全ての resourceを含みます)。


サンプル

下記にtrueになる条件、falseになる条件があります。
<?php
var_dump((bool) "");        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) "foo");     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) "false");   // bool(true)
?>

注意点

今回、ソースの改修時に今回のようなケースがあったのでまとめましたが、変数だけをif文に入れることがないようにするのがベストです。
理由としましては、具体的に条件を明示していない状態のif文だと後にバグが出やすいということです。
例えば入力チェックで以下のような場合。
$value = "0"; // 入力値
if($value){
	echo "入力あり";
}else{
	echo "入力なし";
}
この場合は想定としては未入力(空白 or null)としてコーディングしていたが、「0」を入力された場合もfalseになってしまい、想定外の処理が走ってしまうことになります。

処理を明示してコーディングを行うことによって、バグが少なくなります。
条件を明示した場合のコーディング。
$value = "0"; // 入力値
if($value == "" && is_null($value)){
	echo "入力あり";
}else{
	echo "入力なし";
}
私としては皆様に出来る限りやってもらいたいですね・・・


コメントを残す