当ブログの著者について
PHP/Laravel

「0」や「”」はfalse?

cmeloengineer

こんにちは、Cメロです。

今回はif文の条件に入れた際に、falseとして扱われる値を調べました。

誰もが一度は調べる内容だと思うので、例に漏れず自分も一度確認して記しておこうと思います。

falseとして扱われる値

何はともあれ、ひとまず公式のページを確認します。

公式ドキュメント
論理型 (boolean) - Manual
論理型 (boolean) – Manual

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になるかをしっかり確認して、読み進めていきたいですね。

ここまでお読みいただき、ありがとうございました!

ABOUT ME
Cメロ
Cメロ
大阪在住エンジニア
大阪在住のエンジニアです。
仕事ではPHPやJavaScript、MySQLなどをメインで扱っています。
今学びたいのはテーブル設計やSQLチューニング、TypeScript、Reactなどです。
勉強したことを整理するためにブログに投稿していきます。
記事URLをコピーしました