PHP 中看似簡單的賦值與邏輯運算組合,往往隱藏著令人踩坑的運算符優先級陷阱。本文通過三個經典變形題,層層剖析 =、||、&& 的優先級與短路求值機制,幫你徹底搞懂「為什麼結果是這樣」。
<?php
$a = 3;
$b = 6;
if ($a = 5 || $b = 7) {
$a++;
$b++;
}
var_dump($a, $b);
$a = 5 視為 $a == 5 比較 → 預期結果 3, 6(if 不成立)$a = 5 執行後 $b = 7 短路不執行 → 預期結果 6, 7PHP 運算符優先級(由高到低)相關片段:
&&(邏輯與)||(邏輯或)=(賦值)因此 $a = 5 || $b = 7 實際解析為:
$a = (5 || ($b = 7))
5 為真值,|| 短路,右邊 $b = 7 不會執行(此處為關鍵:|| 左側為真時不評估右側)5 || ... 整體結果為 true$a = true,賦值完成,$a 變為 bool(true)if (true) 成立,進入代碼塊$a++:true (1) + 1 = 2(整數)$b++:$b 仍為 6,+1 = 7正確結果: int(2), int(7)
原文輸出
true, 7可能為 PHP 版本差異或筆誤,實際var_dump會顯示int(2),因true++在 PHP 中轉為整數 1 再加 1 得 2。
$a = 3; $b = 6; $c = 1;
if ($a = 5 || $b = 7 && $c = 10) {
$a++; $b++;
}
var_dump($a, $b, $c);
&& 優先級高於 ||,故結構為:
$a = (5 || (($b = 7) && ($c = 10)))
5 為真,|| 短路,整個右側 ($b = 7) && ($c = 10) 不執行$a = true$a++ → 2,$b++ → 7,$c 保持 1結果: int(2), int(7), int(1)
$a = 3; $b = 6; $c = 1;
if ($a = 0 || $b = 7 && $c = 10) {
$a++; $b++;
}
var_dump($a, $b, $c);
$a = 0 賦值完成,$a 為 0(假)|| 左側為假,**必須評估右側**$b = 7 && $c = 10:$b = 7(真)→ 繼續評估 $c = 10(真)0 || true → true,$a = true(覆蓋先前的 0)$a++ → 2,$b++ → 8,$c = 10結果: int(2), int(8), int(10)
| 運算符 | 優先級 | 結合方向 | 短路特性 |
|---|---|---|---|
&& | 高 | 左到右 | 左側假則短路 |
|| | 中 | 左到右 | 左側真則短路 |
= | 低 | 右到左 | 無 |
if (($a = 5) || ($b = 7))== / ===,賦值單獨寫在 if 之前if ($x = ...) 立即要求作者說明意圖理解運算符優先級與短路求值,是寫出可靠 PHP 條件邏輯的基石。下次遇到類似代碼,請先在腦中加上括號,再推導執行流程。