PHP 中 && 與 & 僅差一字元,卻代表完全不同的運算邏輯。混淆兩者是新手常見 Bug 來源。本文將從定義、真值表、實例、應用場景四個維度徹底釐清差異。
屬於邏輯運算子,僅處理布林值(true/false)。兩邊運算元皆為 true 時才回傳 true,否則 false。具備短路特性:左邊為 false 時,右邊不再執行。
| A | B | A && B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
!$a:邏輯非$a && $b:邏輯與$a || $b:邏輯或$isLogin = true;
$hasPerm = false;
if ($isLogin && $hasPerm) {
echo '允許存取';
} else {
echo '權限不足';
}
// 輸出:權限不足(短路:$hasPerm 為 false,後續不執行)
屬於位元運算子,對整數的二進位制逐位運算:對應位皆為 1 時結果位為 1,否則 0。不具短路特性,兩邊皆會完整運算。
5 = 0b0101
3 = 0b0011
5 & 3 = 0b0001 = 1
const READ = 1; // 0b0001
const WRITE = 2; // 0b0010
const EXEC = 4; // 0b0100
const ADMIN = 8; // 0b1000
$userPerm = READ | WRITE; // 0b0011 = 3
// 檢查是否有 READ 權限
if ($userPerm & READ) {
echo '可讀取'; // true
}
// 檢查是否同時擁有 READ 和 WRITE
if (($userPerm & (READ | WRITE)) === (READ | WRITE)) {
echo '可讀寫'; // true
}
| 特性 | && (邏輯與) | & (位元和) |
|---|---|---|
| 運算對象 | 布林值 | 整數(位元) |
| 回傳型別 | bool | int |
| 短路求值 | 是 | 否 |
| 典型用途 | 條件判斷、流程控制 | 權限遮罩、旗標運算、底層優化 |
| 優先級 | 低 | 高(高於 ==、||) |
$a = 5; $b = 3;
$result = $a & $b == 1; // 解析為 $a & ($b == 1) → 5 & true → 1 (true)
// 建議加括號
$result = ($a & $b) == 1; // 正確
function foo() { echo 'foo'; return false; }
function bar() { echo 'bar'; return true; }
if (foo() & bar()) { } // 輸出 foo bar(兩邊都執行,無短路)
if (foo() && bar()) { } // 輸出 foo(短路,bar 不執行)
&& 會將運算元轉布林;& 會將運算元轉整數("5" & 3 = 1)。&& 是給邏輯判斷用的,& 是給位元運算用的。記住:「雙符號做邏輯,單符號做位元」,並在條件判斷中善用短路特性提升效能與避免副作用。