タイトル: 比較演算子
SEOタイトル: PHP 比較演算子の徹底解説(== / === / <=> / Type Juggling / PHP 8 変更)
| この記事の要点 |
|
演算子一覧
| 演算子 | 名前 | 意味 | 結果 |
|---|---|---|---|
$a == $b | 等しい | 型変換後に等しいか | bool |
$a === $b | 厳密に等しい | 型まで含めて等しいか | bool |
$a != $b / $a <> $b | 等しくない | 緩い不等価 | bool |
$a !== $b | 厳密に等しくない | 厳密な不等価 | bool |
$a < $b | 未満 | 小なり | bool |
$a > $b | 超過 | 大なり | bool |
$a <= $b | 以下 | 小なりイコール | bool |
$a >= $b | 以上 | 大なりイコール | bool |
$a <=> $b | 宇宙船 (Spaceship) | -1 / 0 / 1 を返す | int |
$a ?? $b | Null 合体 | $a が null なら $b | 値 |
== (緩い比較) と === (厳密比較)
原則: === を使う
== の罠は実際の事故に直結します。意図して緩く比較したい場合以外は === を使ってください:
PHP 8 での文字列・数値比較の変更
PHP 7 までは数値文字列でない文字列も数値に変換して比較していました。PHP 8 で挙動が変わっています:
| 式 | PHP 7 | PHP 8 |
|---|---|---|
0 == "abc" | true ("abc" → 0) | false (数値→文字列で比較) |
0 == "" | true | false |
0 == "0" | true | true (両方とも数値文字列扱い) |
10 == "10abc" | true | false + Warning |
10 == "10" | true | true |
宇宙船演算子 <=> (PHP 7+)
並べ替え (usort) や 3 項比較に便利:
2); // int(-1)
var_dump(2 <=> 2); // int(0)
var_dump(3 <=> 2); // int(1)
var_dump('a' <=> 'b'); // int(-1)
var_dump([1, 2] <=> [1, 3]); // int(-1)
// usort で並べ替え
$users = [
['name' => 'Bob', 'age' => 30],
['name' => 'Alice', 'age' => 25],
];
usort($users, fn ($a, $b) => $a['age'] <=> $b['age']);
// → 年齢の昇順
// 複合キー
usort($users, fn ($a, $b) =>
$a['age'] <=> $b['age'] // 第一に年齢
?: strcmp($a['name'], $b['name']) // タイブレーカーで名前
);
Null 合体演算子 ?? と ??= (PHP 7+)
配列の比較
1, 'y' => 2];
$b = ['y' => 2, 'x' => 1]; // 順序違い
$c = ['x' => '1', 'y' => '2']; // 型違い
var_dump($a == $b); // bool(true) ← キーと値が一致すれば順序不問
var_dump($a === $b); // bool(false) ← 順序まで含めて厳密比較
var_dump($a == $c); // bool(true) ← 緩い比較で型変換
var_dump($a === $c); // bool(false) ← 型違い
// 数値添字配列
var_dump([1,2,3] === [1,2,3]); // true
var_dump([1,2,3] === [3,2,1]); // false (順序違い)
オブジェクトの比較
Type Juggling (型ジャグリング) のルール
異なる型を == で比較したときの変換ルール(PHP 8 ベース):
| 左 | 右 | 比較方法 |
|---|---|---|
| null / bool | any | 両者を bool に変換 |
| int / float | 数値文字列 | 両者を数値として比較 |
| int / float | 非数値文字列 | PHP 8: 文字列として比較 |
| string | string | 文字列比較 |
| array | array | 要素同士を比較 |
| object | object | 同クラス + プロパティ一致 |
FAQ
Q: switch 文の中での比較は?
A: switch は == 相当(緩い比較)。意図しない一致を避けたいときは match(PHP 8+)が === 相当で安全。
Q: in_array の比較は?
A: 既定で == 緩い比較。in_array($needle, $arr, true) の第 3 引数 true で === 厳密比較に。常に true を指定を推奨。
Q: 浮動小数の比較
A: 0.1 + 0.2 == 0.3 は false。abs($a - $b) < PHP_FLOAT_EPSILON 等で許容誤差比較を。