PHP比較演算子「==」と「===」の違いについて


比較演算子について

比較演算子を使用する際は==ではなく厳密な比較演算子である===の方が良いと聞きますが、どう違うのか気になって調べたのでそのことを書いていこうと思います。

比較演算子==について

PHPマニュアル(https://www.php.net/manual/ja/language.operators.comparison.php
)を見ると、こんな定義でした。

演算子 内容
\$a == $b 型の相互変換をした後で \$a が $b に等しい時に TRUE
\$a === $b \$a が $b に等しく、および同じ型である場合に TRUE

イマイチピンと来ないのでこんなコードを用意しました。

<?php
$a = 120;
$b = "120abcer1ere";

if($a == $b) {
    echo "true",PHP_EOL;
} else {
echo "false",PHP_EOL;
}

変数aと変数bが等しければtrue、そうでなければfalseを出力するように記載しています。格納されてる値が違いますが、比較演算子==を使用したこのコードを実行するとtrueが出力されます。

これにはキャストが関係しています。

キャストについて

キャストとは、変数などのデータ型を変換することを意味します。
PHPでは型の指定をしなくても実行に問題がありませんが、型は存在します。PHP側で自動的に型を設定してくれているので普段意識することはありませんが、今回のような比較演算子==を使う際に関係してきます。

また、PHPには自動キャストという機能があり、異なる型同士で演算を行うと型を変換します。

今回のコードで言うと、比較する際に変数bの型を自動的にint型に変換している為「120」が変数bの値となり、trueが出力されます。

詳しく見ていきます。
型による値の変化を見る為に下記コードを作成しました。

<?php
$b = "120abcer1ere";

var_dump($b);
var_dump((int)$b);

var_dumpは変数の型や格納されている値を表示してくれます。
var_dump((int)$b)で格納されている値をint型で表示するように指示しています。

実行結果は下記です。

string(12) "120abcer1ere"
int(120)

そのまま出力すればstring型で格納した値全てが表示されますが、int型を指定するとアルファベット以降に記載した値は出力されません。

今回変数aと変数bが==で比較された際にtrue判定になったのは、変数bの型が自動キャストによりint型に変換された為です。

==は型の相互変換を行うのでint型に合わせる為trueが、===は型の変換を行わないのでfalseが出力されます。

最後に各比較演算子を使用した場合の値を記載します。

<比較演算子`==`を使用した場合>
<?php
$a = 120;
$b = "120abcer1ere";

if($a == $b) { //自動キャストされるので、「120 = 120」の比較になりtrueが出力される。
    echo "true",PHP_EOL;
} else {
echo "false",PHP_EOL;
}
<比較演算子`===`を使用した場合>
<?php
$a = 120;
$b = "120abcer1ere";

if($a === $b) { //自動キャストされないので、「120 = 120abcer1ere」の比較になりfalseが出力される。
    echo "true",PHP_EOL;
} else {
echo "false",PHP_EOL;
}

終わりに

基本的には厳密な比較演算子===を使えば自動キャストは行われないので、前情報通りこちらを使用した方が無難そうです。