厳密等価演算子(===)と等価演算子(==)の違いと比較表


PHPにおける、厳密等価演算子(===)と等価演算子(==)の違いについてです。

# 厳密等価演算子(===)と等価演算子(==)の違い
`===` は型まで同一か見てくれます。
`==` は気をつかって型を変換したうえで比較してくれます。優しいですね。優男(ヤサオ)っていま褒め言葉らしいですね。

# どちらを使用すべきか？
一見、自動で変換してくれる`==` のほうが便利そうです。
しかし基本的には`===`を使用したほうがよいでしょう。

`==`を使用した場合、↓の比較は全てtrueとなります。
直感的ではありませんね。
直感的でないということはバグを埋め込みやすくなってしまいます。

```php
<?php
echo 0 == null ? 'true' : 'false';       // true
echo 1 == true ? 'true' : 'false';       // true
echo array() == null ? 'true' : 'false'; // true
echo "" == false ? 'true' : 'false';     // true
```

`==`を「絶対使うな」とまでは思いませんが、「よくわからないなら`===`使っとくのが無難だよ」ということですね。

# 比較表

縦横交差している部分が評価結果です。
※ 〇:true 、-:falseです。

|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|TRUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|FALSE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"1" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"0" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"-1" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|NULL &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|array() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"php" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|---------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|---------|-------|-------|-------|-------|-------|-------|
|         | == | === | == | ===   | ==    | ===   | ==    | ===   | ==    | ===   | ==    | ===   | ==    | ===   | ==    | ===   | ==    | ===   | ==      | ===   | ==    | ===   | ==    | ===   | |
| TRUE    | 〇  | 〇  | - | - | 〇  | - | - | - | 〇  | - | 〇  | - | - | - | 〇  | - | - | - | -   | - | 〇  | - | - | - |    TRUE    |
| FALSE   | - | - | 〇  | 〇  | - | - | 〇  | - | - | - | - | - | 〇  | - | - | - | 〇  | - | 〇    | - | - | - | 〇  | - |    FALSE   |
| 1       | 〇  | - | - | - | 〇  | 〇  | - | - | - | - | 〇  | - | - | - | - | - | - | - | -   | - | - | - | - | - |          1       |
| 0       | - | - | 〇  | - | - | - | 〇  | 〇  | - | - | - | - | 〇  | - | - | - | 〇  | - | -   | - | 〇  | - | 〇  | - |    0       |
| -1      | 〇  | - | - | - | - | - | - | - | 〇  | 〇  | - | - | - | - | 〇  | - | - | - | -   | - | - | - | - | - |          -1      |
| "1"     | 〇  | - | - | - | 〇  | - | - | - | - | - | 〇  | 〇  | - | - | - | - | - | - | -   | - | - | - | - | - |          "1"     |
| "0"     | - | - | 〇  | - | - | - | 〇  | - | - | - | - | - | 〇  | 〇  | - | - | - | - | -   | - | - | - | - | - |          "0"     |
| "-1"    | 〇  | - | - | - | - | - | - | - | 〇  | - | - | - | - | - | 〇  | 〇  | - | - | -   | - | - | - | - | - |          "-1"    |
| NULL    | - | - | 〇  | - | - | - | 〇  | - | - | - | - | - | - | - | - | - | 〇  | 〇  | 〇    | - | - | - | 〇  | - |      NULL    |
| array() | - | - | 〇  | - | - | - | - | - | - | - | - | - | - | - | - | - | 〇  | - | 〇    | 〇  | - | - | - | - |          array() |
| "php"   | 〇  | - | - | - | - | - | 〇  | - | - | - | - | - | - | - | - | - | - | - | -   | - | 〇  | 〇  | - | - |         "php"   |
| ""      | - | - | 〇  | - | - | - | 〇  | - | - | - | - | - | - | - | - | - | 〇  | - | -   | - | - | - | 〇  | 〇  |        ""      |
表自体はPHPマニュアルにあるものを引っ張て来ています。
公式の表が見づらかったので加工しています。
[PHP 型の比較表](https://php.net/manual/ja/types.comparisons.php)

# 終わりに

この記事は今触っているコードが `==` だらけで糞ワロタというモチベーションで書かれました。