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

PHP 運算子陷阱:位運算子「|」與邏輯運算子「||」的優先級與短路差異

     編輯:PHP 相關知識

現象對比

<?php
// 範例 1:位運算子 |
$a = 0; $b = 0;
if ($a = 3 | $b = 3) {
    $a++; $b++;
}
echo $a . ',' . $b; // 輸出:4,4
?>
<?php
// 範例 2:邏輯運算子 ||
$a = 0; $b = 0;
if ($a = 3 || $b = 3) {
    $a++; $b++;
}
echo $a . ',' . $b; // 輸出:1,1
?>

深度解析

範例 1:位運算子 |

  • 優先級:| > =(賦值運算子)
  • 運算順序:$a = (3 | $b = 3)
  • 步驟:
    1. $b = 3 執行,$b 變為 3,回傳 3
    2. 3 | 3 → 二進位 0011 | 0011 = 0011 (十進位 3)
    3. $a = 3 執行,$a 變為 3
    4. if (3) 為真,進入區塊
    5. $a++ → 4,$b++ → 4

範例 2:邏輯運算子 ||

  • 短路特性:左運算元為真時,右運算元不會執行
  • 運算順序:$a = (3 || $b = 3)
  • 步驟:
    1. 3 為真(非零即真)
    2. 觸發短路,$b = 3 不執行,$b 維持 0
    3. 3 || ... 回傳 true (布林值)
    4. $a = true,$a 變為布林 true
    5. if (true) 進入區塊
    6. $a++:true (1) + 1 = 1 (仍為 true)
    7. $b++:0 + 1 = 1

核心差異總表

特性位運算子 |邏輯運算子 ||
運算對象整數位元布林邏輯值
短路否是
優先級高於 =低於 =
回傳型別整數布林
適用場景位元旗標操作、權限遮罩條件判斷、流程控制

最佳實踐建議

  1. 條件判斷務必使用 || / &&,避免非預期的賦值副作用。
  2. 明確加上括號:if (($a = 3) || ($b = 3)) 消除歧義。
  3. 避免在條件式中賦值:改為先賦值再判斷,提升可讀性。
  4. 啟用靜態分析工具(PHPStan、Psalm)偵測此類潛在問題。

摘自 zdrjlamp

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