運算子是程式語言進行資料運算與邏輯判斷的基礎符號。PHP 繼承了 C、Perl 的運算子體系,並擴充了錯誤控制、執行、陣列等特有運算子。本文系統整理 PHP 所有運算子類別、語法、優先序與常見陷阱。
| 類別 | 運算子 | 範例 |
|---|---|---|
| 算術 | + - * / % | $a + $b |
| ** (冪) | $a ** $b (PHP 5.6+) | |
| ++ -- | 前置/後置遞增遞減 | |
| + - (一元) | +$a, -$b | |
| . | 字串串接 | |
| .= | 字串串接賦值 | |
| 賦值 | = | $a = $b |
| += -= *= /= %= **= | $a += 3 | |
| .= | 字串串接賦值 | |
| &= |= ^= <<= >>= | 位元賦值 | |
| ??= | Null 合併賦值 (PHP 7.4+) | |
| 比較 | == != <> | 鬆散比較 (型別轉換) |
| === !== | 嚴格比較 (型別+值) | |
| < > <= >= | 大小比較 | |
| <=> | 太空船運算子 (PHP 7.0+),回傳 -1/0/1 | |
| ?? | Null 合併運算子 (PHP 7.0+) | |
| ?: | Elvis 運算子 (三元簡寫) | |
| 邏輯 | and / && | 邏輯 AND (&& 優先序較高) |
| or / || | 邏輯 OR | |
| xor | 邏輯 XOR | |
| ! | 邏輯 NOT | |
| 位元 | & | ^ ~ | AND OR XOR NOT |
| << >> | 左移/右移 | |
| 陣列 | + | 聯集 (鍵名不覆蓋) |
| == === != !== <=> | 陣列比較 | |
| 型別 | instanceof | 物件型別檢查 |
| (int) (bool) (array) ... | 型別轉換 (Cast) | |
| 其他 | @ | 錯誤控制 (抑制警告) |
| ` ` (反引號) | 執行系統指令 (同 shell_exec) | |
| clone | 物件複製 |
1. clone new [右]
2. ** [右]
3. ++ -- ~ (int) (bool) ... @ [右]
4. instanceof [無]
5. * / % [左]
6. + - . [左]
7. << >> [左]
8. < <= > >= <> [無]
9. == != === !== <=> [無]
10. & [左]
11. ^ [左]
12. | [左]
13. && [左]
14. || [左]
15. ?? [左]
16. ?: [右]
17. = += -= *= /= .= %= **= &= |= ^= <<= >>= ??= [右]
18. and [左]
19. xor [左]
20. or [左]
關鍵口訣:一元 > 算術 > 位移 > 比較 > 位元 > 邏輯 > 三元/Null合併 > 賦值 > and/xor/or。
'0' == 0 // true
'0' == false // true
'' == 0 // true
'' == false // true
'php' == 0 // true (字串非數字開頭轉為 0)
'1e3' == '1000' // true (科學記號)
'0x10' == '16' // true (十六進位)
鐵律:永遠使用 === / !==,除非你極度確定型別且需要鬆散比較語意。
$a = 5 . 3 + 2; // 解析為 5 . (3 + 2) = '55'
$b = 5 + 3 . 2; // 解析為 (5 + 3) . 2 = '82'
// 建議:字串運算加括號
$c = 5 . (3 + 2); // '55'
$x = 'Z'; $x++; // 'AA' (Perl 風格字母遞增)
$y = '9'; $y++; // '10' (數字遞增)
$z = 'a9'; $z++; // 'b0' (混合遞增)
僅適用於純字母、純數字、字母+數字結尾模式,其他情況行為未定義。
| 運算式 | $a = null | $a = '' | $a = 0 | $a = 'hello' |
|---|---|---|---|---|
| $a ?? 'default' | default | '' | 0 | hello |
| $a ?: 'default' | default | default | default | hello |
??:只檢查 null (PHP 7.0+)?::檢查 falsy (null, false, 0, '', '0', []) (PHP 5.3+)$a = [0 => 'a', 1 => 'b'];
$b = [1 => 'x', 2 => 'y'];
$c = $a + $b; // [0 => 'a', 1 => 'b', 2 => 'y']
// $b[1] 被忽略,因 $a 已有鍵 1
若需重新索引合併,用 array_merge() 或 [...$a, ...$b] (PHP 7.4+)。
error_reporting,有微小效能損耗。isset()、empty()、array_key_exists()、try-catch、自訂錯誤處理器。(int)$x 而非 intval($x) (效能略優)JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE)精通運算子優先序與型別轉換規則,是寫出無 Bug、高可讀性 PHP 代碼的基石。建議在 IDE 開啟 PHPStan/Psalm 靜態分析,自動偵測鬆散比較、型別不匹配等潛在問題。記住:明確優於隱含,嚴格優於鬆散。