===(全等)同時比較值與型別,不進行型別轉換。==(相等)會嘗試型別轉換後比較。本文詳細解析標量、陣列、物件、NULL、資源等各類型的比較行為。
| 運算式 | === 結果 | == 結果 | 說明 |
|---|---|---|---|
123 === 123 | true | true | 同型同值 |
123 === '123' | false | true | int vs string |
0 === false | false | true | int vs bool |
'' === false | false | true | string vs bool |
null === false | false | true | null vs bool |
'0' === 0 | false | true | string vs int |
[] === [] | true | true | 空陣列 |
[1] === [1] | true | true | 索引陣列同序同值 |
['a'=>1] === ['a'=>1] | true | true | 關聯陣列同鍵同值同序 |
[1,2] === [2,1] | false | false | 順序不同 |
<?php
class Person {
public string $name;
public function __construct(string $name) { $this->name = $name; }
}
$p1 = new Person('Alice');
$p2 = new Person('Alice');
$p3 = $p1;
var_dump($p1 === $p2); // false:不同實例
var_dump($p1 == $p2); // true:屬性值相同、同類別
var_dump($p1 === $p3); // true:同一實例(引用)
var_dump($p1 == $p3); // true
?>
===:同一實例(記憶體位址相同)。==:同類別且所有屬性值相等(遞歸比較)。<?php
// NULL
var_dump(null === null); // true
var_dump(null === false); // false
// 資源
$fp1 = fopen('php://memory', 'r');
$fp2 = fopen('php://memory', 'r');
var_dump($fp1 === $fp2); // false:不同資源
var_dump($fp1 == $fp2); // false:資源不支援 == 比較(PHP 8.1+ 拋出 TypeError)
// NaN
var_dump(NAN === NAN); // false(IEEE 754 規定 NaN != NaN)
var_dump(NAN == NAN); // false
$_POST['age'] === 18 永遠 false,需 (int)$_POST['age'] === 18 或 $_POST['age'] == 18。$row['id'] === 1 可能 false,建議 PDO::ATTR_STRINGIFY_FETCHES => false + PDO::ATTR_EMULATE_PREPARES => false 獲得原生型別。parse_ini_file 返回字串,嚴格比較需轉型。$cache->get('key') === false 區分「快取未命中」vs「快取值為 false」。===,減少隱性 Bug。=== 是「值+型別」雙重保障。理解各型別比較語義,養成預設用 ===、只在確需轉換時用 == 的習慣,能消除一大類難以重現的邏輯 Bug。