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

PHPの比較演算子「==」と「===」の違いと「==」を使用すべきかについて

cmeloengineer

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

みなさんは「==」と「===」の違いを説明できるでしょうか。なんとなく、「==」はバグの元になるから使わないようにと言われているイメージがありますよね。

自分自身、なぜ「==」の使用を避けるように言われるかちゃんと理解できていないと思ったので、調べることにしました。

「==」と「===」の違い

まずは公式ドキュメントを見てみましょう。

PHP公式ドキュメント
比較演算子 - Manual
比較演算子 – Manual
名前結果
$a == $b等しい型の相互変換をした後で $a が $b に等しい時に true
$a === $b等しい$a が $b に等しく、および同じ型である場合に true 。
$a != $b等しくない型の相互変換をした後で $a が $b に等しくない場合に true
$a <> $b等しくない型の相互変換をした後で $a が $b に等しくない場合に true
$a !== $b等しくない$a が $b と等しくないか、同じ型でない場合に true 。
オペランドが両方 数値形式の文字列 の場合、 もしくは一方が数値で、もう一方が 数値形式の文字列 の場合、 比較は数値として行われます。 これらのルールは switch 文にも適用されます。 型の変換は 演算子が === や !== の場合は行われません。 なぜなら、これらの演算子は、値と型を両方比較するものだからです。

「$a === $b」は値と型が一致していた場合、trueになります。「$a !== $b」は値または型が不一致でtrueになります。

一方で「$a == $b」「$a != $b」「$a <> $b」は「型の相互変換」をした後で$aと$bの一致・不一致を確認しています。$aと$bの「両方が数値形式の文字列」または「一方が数値形式の文字列」の場合は「数値」に変換して比較しているようです。

こんなとき「==」を使うとどうなる?

以下のケースを考えてみます。

1if($a == 0) {
2    echo($a)
3}

このif文では$aに以下のような値が入るとtrueになります。

1$a = 0
2$a = '0'
3$a = '000'
4$a = '0E1'

if文を書いた段階で想定しているのは上二つくらいでしょうか。「$a = ‘0E1’」なんかは想定できませんよね…。0E1が0*(10^1)=0と判定されているようです。

次のケースではどうでしょうか。

1if($b == true){
2    echo($b)
3}

このif文では$bに以下のような値が入るとfalseになります。

1$b = false
2$b = ''
3$b = null
4$b = '0'

上記の値はbool値への型変換がされています。「$b = ”」や「$b = ‘0’」は要件によってはtrueで判定してほしい場合もあったりしますよね。

bool値へ型変換したときにfalseになる値については以下の記事でまとめています。こちらもご確認ください。

あわせて読みたい
「0」や「”」はfalse?
「0」や「”」はfalse?

「==」を使うべきか

上記を踏まえて、結論「==」を使うのはやはり避けた方がよいと思います。公式ドキュメントにも以下のような記述があります。

注意: PHP における型の相互変換の動作は、 異なる型同士を比較する時には必ずしも自明でないことに注意して下さい。 整数型 と boolean を比較したり、 整数型 を 文字列 と比較する場合は特にそうです。 よって一般的には、 == や != ではなく === と !== を使う方がほとんどの場合は好ましいです。

確認してきたように、型の相互変換が起きた場合の挙動には、予測できないものが含まれます。想定外の挙動を作り込まないよう、「==」の使用は避けた方がいいと思います。

調べるにあたり、「==」を使ってもよいケースというのを考えていたのですが、結果的には思いつきませんでした。もちろん、異なる型同士の一致を確認しないといけない場面もあるかもしれませんが、そのときは比較ロジックの前に、値の入力などの仕様を改めて確認した方が良いと思います。

今回は以上になります。ご覧いただきありがとうございました!

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