條件判斷是程式邏輯的基石。PHP 提供 if、else、elseif 構建分支邏輯,本文從語法、巢狀結構、常見陷阱到最佳實踐完整說明。
<?php
if (條件表達式) {
// 條件為 true 執行的程式碼區塊
} elseif (另一個條件) {
// 前面條件皆 false,此條件為 true 時執行
} else {
// 所有前面條件皆 false 時執行
}
?>
單行語句可省略大括號 (不建議,易誤導):
<?php
if ($a > $b) echo "$a 大於 $b";
else echo "$a 不大於 $b";
?>
多行務必加大括號:
<?php
$d = date('D'); // 取得星期幾縮寫 Mon, Tue...
if ($d === 'Fri') {
echo "週五快樂!
";
echo "週末即將來臨。
";
echo "別忘了備份代碼。";
} else {
echo "今天是 $d,繼續加油!";
}
?>
<?php
$score = 85;
if ($score >= 90) {
$grade = 'A';
} elseif ($score >= 80) {
$grade = 'B';
} elseif ($score >= 70) {
$grade = 'C';
} elseif ($score >= 60) {
$grade = 'D';
} else {
$grade = 'F';
}
echo "等級:$grade"; // 輸出 B
?>
執行順序: 由上而下,第一個符合條件的區塊執行後,整個結構結束,不再檢查後續條件。
| 運算子 | 名稱 | 範例 | 結果 |
|---|---|---|---|
== | 相等 (值) | 5 == "5" | true |
=== | 全等 (值+型別) | 5 === "5" | false |
!= / <> | 不相等 | 5 != 3 | true |
!== | 不全等 | 5 !== "5" | true |
<, >, <=, >= | 大小比較 | 5 > 3 | true |
&& / and | 邏輯 AND | $a>0 && $b<10 | 皆真為真 |
|| / or | 邏輯 OR | $a==1 || $b==2 | 任一真為真 |
! | 邏輯 NOT | !$flag | 取反 |
<?php
// ❌ 錯誤:指派永遠回傳指派的值 (非 0 即 true)
if ($status = 'error') { ... }
// ✅ 正確:比較
if ($status === 'error') { ... }
// 防呆寫法:常數放左邊 (Yoda Condition)
if ('error' === $status) { ... } // 若誤寫 = 會報語法錯誤
?>
<?php
$var = 0; // false
$var = ''; // false
$var = '0'; // false (字串 "0" 為 false!)
$var = []; // false
$var = null; // false
$var = false; // false
// 建議明確比較
if ($var !== null && $var !== '' && $var !== false) { ... }
?>
<?php
// ❌ 巢狀地獄
function checkUser($user) {
if ($user) {
if ($user->isActive()) {
if ($user->hasPermission('admin')) {
return true;
}
}
}
return false;
}
// ✅ Guard Clauses 提早返回
function checkUser($user) {
if (!$user) return false;
if (!$user->isActive()) return false;
if (!$user->hasPermission('admin')) return false;
return true;
}
?>
<?php
// 三元運算子 ?: (簡單 if-else)
$status = $isLoggedIn ? '線上' : '離線';
// Null 合併運算子 ?? (PHP 7.0+) - 變數不存在或為 null 時給預設值
$name = $_GET['name'] ?? '訪客';
// 串聯 ??
$config = $userConfig ?? $siteConfig ?? $defaultConfig;
?>
PHP 8.0+ 引入 match,比 switch 更嚴格 (嚴格比較 ===)、無 fall-through、可直接回傳值:
<?php
$grade = match (true) {
$score >= 90 => 'A',
$score >= 80 => 'B',
$score >= 70 => 'C',
$score >= 60 => 'D',
default => 'F',
};
?>
$input 是否為有效 Email 格式 (使用 filter_var),並輸出對應訊息。條件判斷的核心是「清晰表達業務邏輯」。善用 Guard Clauses、嚴格比較 (===)、match 表達式,能寫出更健壯、可維護的代碼。