PHP 比較運算符決定值之間的關係,但因 PHP 弱型別特性,==(鬆散比較)與 ===(嚴格比較)行為差異極大,是常見 Bug 來源。
| 運算符 | 名稱 | 條件 | 型別檢查 |
|---|---|---|---|
== | 等於 | 值相等(經型別轉換) | 否 |
=== | 全等 | 值相等且型別相同 | 是 |
!= / <> | 不等於 | 值不相等 | 否 |
!== | 不全等 | 值不等或型別不同 | 是 |
< | 小於 | 數值/字串比較 | - |
> | 大於 | 數值/字串比較 | - |
<= | 小於等於 | - | - |
>= | 大於等於 | - | - |
<?php
$a = 2; // integer
$b = 2.0; // float (double)
if ($a == $b) {
echo "相等\n"; // 輸出:相等(值轉換後相等)
}
if ($a === $b) {
echo "全等\n";
} else {
echo "不全等\n"; // 輸出:不全等(int !== float)
}
?>
==) 隱性轉換規則| 比較類型 | 轉換規則 |
|---|---|
| 數字 vs 字串 | 字串轉數字("123abc" → 123) |
| 布林 vs 任意 | 轉布林比較 |
| null vs 字串 | null == "" 為 true |
| 陣列 vs 陣列 | 鍵值對逐一比較 |
| 物件 vs 物件 | 同類別比較屬性,不同類別永遠 false |
<?php
var_dump("0" == 0); // true
var_dump("" == 0); // true
var_dump("0" == false); // true
var_dump("" == false); // true
var_dump(null == false); // true
var_dump("abc" == 0); // true (!) 字串非數字開頭轉為 0
var_dump("1e3" == "1000"); // true 科學記號轉換
// 安全比較:永遠使用 ===
var_dump("0" === 0); // false
var_dump("abc" === 0); // false
?>
=== / !==:除非確定需要型別轉換strcmp():避免數字字串被轉換hash_equals():防時序攻擊abs($a-$b) < 0.00001嚴格比較是防禦型編程的基石,能消除 90% 以上型別相關的邏輯錯誤。