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 "入力なし"; }私としては皆様に出来る限りやってもらいたいですね・・・
«前の記事:シンプルで使いやすくWeb上でSQLを整形してくれる「SQL indent」デスマーチってこんなのだ!:次の記事»