首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 運算子完整指南:算術、比較、邏輯、位元、賦值與優先序

     編輯:PHP 相關知識

前言

運算子是程式語言進行資料運算與邏輯判斷的基礎符號。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。

必知的 6 大陷阱

1. 鬆散比較 (==) 的型別轉換地雷

'0' == 0        // true
'0' == false    // true
'' == 0         // true
'' == false     // true
'php' == 0      // true  (字串非數字開頭轉為 0)
'1e3' == '1000' // true  (科學記號)
'0x10' == '16'  // true  (十六進位)

鐵律:永遠使用 === / !==,除非你極度確定型別且需要鬆散比較語意。

2. 字串串接 . 與算術 + 的優先序差異

$a = 5 . 3 + 2;  // 解析為 5 . (3 + 2) = '55'
$b = 5 + 3 . 2;  // 解析為 (5 + 3) . 2 = '82'
// 建議:字串運算加括號
$c = 5 . (3 + 2); // '55'

3. 遞增遞減對字串的特殊行為

$x = 'Z'; $x++; // 'AA' (Perl 風格字母遞增)
$y = '9'; $y++; // '10' (數字遞增)
$z = 'a9'; $z++; // 'b0' (混合遞增)

僅適用於純字母、純數字、字母+數字結尾模式,其他情況行為未定義。

4. Null 合併 (??) vs Elvis (?:) 差異

運算式$a = null$a = ''$a = 0$a = 'hello'
$a ?? 'default'default''0hello
$a ?: 'default'defaultdefaultdefaulthello
  • ??:只檢查 null (PHP 7.0+)
  • ?::檢查 falsy (null, false, 0, '', '0', []) (PHP 5.3+)

5. 陣列聯集 + 不重新索引數字鍵

$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+)。

6. @ 錯誤控制的效能與除錯代價

  • 每次執行會臨時修改 error_reporting,有微小效能損耗。
  • 會吞沒 所有 錯誤 (含致命錯誤),導致除錯極度困難。
  • 替代方案:isset()、empty()、array_key_exists()、try-catch、自訂錯誤處理器。

現代 PHP 推薦寫法

  • 比較:嚴格 === / !==
  • 空值檢查:?? / ??=
  • 條件賦值:?: (Elvis)
  • 多條件比較:<=> (排序回呼神器)
  • 型別轉換:函式式 (int)$x 而非 intval($x) (效能略優)
  • 位元運算:權限遮罩、旗標集合 (如 JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE)

結語

精通運算子優先序與型別轉換規則,是寫出無 Bug、高可讀性 PHP 代碼的基石。建議在 IDE 開啟 PHPStan/Psalm 靜態分析,自動偵測鬆散比較、型別不匹配等潛在問題。記住:明確優於隱含,嚴格優於鬆散。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved