はじめに
PHPのif文などで使う「==(緩やかな比較)」は、異なる型同士でも比較できる便利な演算子です。
ただし、PHP7とPHP8では挙動に違いがあり、思わぬバグの原因になることもあります。
この記事では、PHP初学者の方向けに「==」の挙動を具体例で比較しながら、ポイントをまとめました。
1. 「===」と「==」の違い
まずは基本からおさらいです。
(1)===
- 型と値の両方を比較します。
- 型が異なる場合は必ずfalseになります。
【例】
var_dump(1 === 1); // true
var_dump(1 === '1'); // false
(2)==
- 型が異なる場合は自動で型変換を行い、値を比較します。
- PHPのバージョンによって型変換のルールが変わります。
2. 具体例でみるPHP7とPHP8の違い
以下の式の結果はどうなるか見ていきましょう。
a. 0 == '0'
b. 0 == ''
c. 1 == true
d. 1 == 1.0
(a) 0 == '0'
- 整数と数値文字列の緩やかな比較です。
- 文字列'0'は数値として解釈されるため、数値同士(0と0)の比較になります。
- PHPでは、文字列が整数(int)または浮動小数点数(float)として解釈可能な場合は数値比較になります(数値文字列)。
- 結果:true
- PHP7でも8でも同じです。
var_dump(0 == '0'); // true
(b) 0 == ''
- 整数(0)と空文字列の緩やかな比較です。
- PHP7の場合
- 空文字列を数値(0)に変換して比較します(0 == 0)。
- 結果:true
- PHP8の場合
- 文字列が数値として解釈可能かどうかによって挙動が分かれます。
- 空文字列(非数値文字列)との比較は「文字列同士」として扱われます。
- 文字列 '' が数値として解釈できない場合、文字列同士として比較する → '0' == ''。
- 結果:false
- なお、比較対象の文字列が数値として解釈可能なら、従来通り数値比較を行います。
// PHP7
var_dump(0 == ''); // true
// PHP8
var_dump(0 == ''); // false
(c) 1 == true
- 整数(int)と論理値(bool)の緩やかな比較です。
- 整数0はfalse、0以外はtrueとみなされます。
- よって、「1 == true」はtrue になります。
- PHP7でも8でも同じです。
var_dump(1 == true); // true
(d) 1 == 1.0
- 整数(int)と浮動小数点数(float)の比較です。
- 値が同じなのでtrueです(整数1とfloat1.0は等価)。
- PHP7でも8でも同じです。
var_dump(1 == 1.0); // true
💡 補足
- 浮動小数点数の比較は誤判定を起こすことがあるため、注意が必要です。
- 例えば以下のように誤差で誤判定が起こることがあります。
var_dump(0.1 + 0.2 == 0.3); // false(誤判定)
- これは「0.1」や「0.7」などの少数はコンピュータ上で正確に表せないため、微小な誤差が生じるためです。
3. まとめ
- == は型変換が入るため予期せぬ動きをすることがあります。
- 特にPHP8では、非数値文字列との比較の挙動が大きく変わりました。
- PHP7まで:空文字列や非数値文字列も数値にキャストして比較
- PHP8以降:非数値文字列の場合は文字列同士の比較に変更
- バージョン間の違いに注意し、型チェックや===の利用を心がけましょう。
- 浮動小数点数の比較には誤差があるため、可能であれば専用の関数やライブラリを利用することで精度を向上させることができます。