「0」や「”」はfalse?
こんにちは、Cメロです。
今回はif文の条件に入れた際に、falseとして扱われる値を調べました。
誰もが一度は調べる内容だと思うので、例に漏れず自分も一度確認して記しておこうと思います。
falseとして扱われる値
何はともあれ、ひとまず公式のページを確認します。
boolean への変換
bool に明示的に変換を行うには、キャスト
(bool)
を使用します。 を使用します。論理型が必要な場合には、値は自動的に bool 型に変換されるので、一般的にはキャストは不要です。 詳細な情報は 型の相互変換 のページを参照ください。bool に変換する場合、次の値は
false
とみなされます。
- boolean の
false
- integer の
0
(ゼロ)- float の
0.0
および-0.0
(ゼロ)- 空の文字列
""
、 および文字列の"0"
- 要素の数がゼロである 配列
- unit 型 NULL (値がセットされていない変数を含む)
- bool 型へキャストするように動作がオーバーロードされた内部オブジェクト。 例: 属性がない空要素から作成された SimpleXML オブジェクト。
その他の値は全て
true
とみなされます。 (resource およびNAN
を含みます)警告
-1
は、他のゼロでない数と同様に (正負によらず)true
とみなされます。
公式が丁寧にまとめてくれているのは嬉しいですね!上記の内容を確認します。
検証
要素の数がゼロである配列と値がセットされていない変数を用意します。
1$empty_array = [];
2$null;
falseと判定される値を並べた配列を用意します。
1$array = [false, 0, 0.0, -0.0, "", "0", $empty_array, null, $null];
値がtrueなら「t」、falseなら「f」を出力するif文をループさせます。
1for($i = 0; $i < count($array); $i++){
2 if($array[$i]){
3 var_dump( 't' );
4 } else{
5 var_dump( 'f' );
6 }
7}
結果
1string(1) "f"
2string(1) "f"
3string(1) "f"
4string(1) "f"
5string(1) "f"
6string(1) "f"
7string(1) "f"
8string(1) "f"
9string(1) "f"
if文で使うべきか否か
これについてはいろんな意見があると思いますが、一旦公平に考えるためにメリット・デメリットを挙げてみようと思います。
メリット
コード量が少なくて済む
単純な話ですが、以下の2つのif文なら、下のコードの方が短いです。コードの短さはわかりやすさに直結する要素だと思います。
1if($var !== '')
2if($var)
「null」を同時に回避できる
変数が未定義または変数の値が空のときに条件分岐したい場合、上のコードでは条件が2つですが、下のコードなら条件を1つで記述できます。
1if($var !== null || $var !== '')
2if($var)
デメリット
明示性は低くなる
こちらも単純な話ですが、比較演算子で結んだ方が明示性が高いと思います。以下の2つのif文なら、上のコードの方がどういうときに条件分岐したいか明確でしょう。
1if($int === 0)
2if($int)
想定していない条件でも分岐させる可能性がある
最初に確認したように、falseとして扱われる値はたくさんあります。以下の2つのコードは同じように見えますが、厳密には下のコードは「$var !== ‘0’」も含まれています。
1if($var !== '' || $var !== null)
2if($var)
結論:積極的には使用しない
メリットとデメリットを考えたうえで、自分が使うかどうかですが、積極的には使用しないようにしたいと思っています。
「0」と「null」や、「”」と「null」を同時に除外できるのは便利ですし、そのような場面は多くありますが、コードの明示性の低さと自分が想定していない条件までつけている可能性を加味すると、乱用は厳禁かなと感じました。
唯一、使用してもいいと思う場面が、bool型として使用する変数のtrue/falseを確認するときです。明示性も高いですし、想定外のデータが入っている可能性も低いでしょう。
1if($isGood)
まとめ
if文の中で使用したときにfalseとして扱われる値を確認していきました。自分が使う時は慎重に、人のコードで出てきたときはどういうときにtrue/falseになるかをしっかり確認して、読み進めていきたいですね。
ここまでお読みいただき、ありがとうございました!