條件判斷是程式設計的基石,PHP 提供了 if/else、elseif、switch 等多種控制結構。掌握它們的語法細節、執行機制與最佳實踐,能寫出更清晰、可維護性更高的程式碼。
<?php
if (條件) {
// 條件為 true 時執行
} else {
// 條件為 false 時執行
}
?>
範例:判斷是否為週末
<?php
if (date("D") == "Sat") {
echo "週末到了,好好放鬆一下!";
} else {
echo "繼續努力工作/學習吧!";
}
?>
即使 else 只有一行,養成加大括號的習慣可避免後續維護時的邏輯錯誤:
<?php
if (file_exists("/usr/local/lib/php3.ini")) {
echo "找到 PHP3 設定檔";
readfile("/usr/local/lib/php3.ini");
} else {
echo "找不到設定檔";
}
?>
當需要依序檢查多個互斥條件時使用:
<?php
if (條件1) {
// ...
} elseif (條件2) {
// ...
} elseif (條件3) {
// ...
} else {
// 以上皆不符合
}
?>
範例:比較兩數大小
<?php
$a = 10; $b = 20;
if ($a > $b) {
echo "a 比 b 大";
} elseif ($a == $b) {
echo "a 等於 b";
} else {
echo "a 比 b 小";
}
?>
超過 3-4 層的 if/elseif/else 會嚴重降低可讀性,建議重構為:
Guard Clause)switch 或查表法<?php
switch (運算式) {
case 值1:
// 程式碼
break;
case 值2:
// 程式碼
break;
default:
// 所有 case 都不符合時執行
}
?>
case 值比較(使用鬆散比較 ==)break 跳出break 會「貫穿」執行下一個 case(通常是 Bug)default<?php
$d = date("D"); // 取得星期縮寫 Mon, Tue...
switch ($d) {
case "Mon": echo "週一"; break;
case "Tue": echo "週二"; break;
case "Wed": echo "週三"; break;
case "Thu": echo "週四"; break;
case "Fri": echo "週五"; break;
case "Sat": echo "週六"; break;
case "Sun": echo "週日"; break;
default: echo "未知日期";
}
?>
利用 switch 實現簡易的 action 分派器:
<?php
// solution.php
$action = $_GET['action'] ?? 'default';
switch ($action) {
case 'add':
echo "執行新增功能";
break;
case 'del':
echo "執行刪除功能";
break;
case 'search':
echo "執行查詢功能";
break;
case 'update':
echo "執行更新功能";
break;
default:
echo "未知操作";
}
?>
PHP 8.0 引入 match 表達式,採用嚴格比較 (===),且不需要 break:
<?php
$result = match ($status) {
200 => '成功',
404 => '找不到',
500 => '伺服器錯誤',
default => '未知狀態',
};
?>
<?php
// 多個值執行相同邏輯
switch ($role) {
case 'admin':
case 'super_admin':
case 'editor':
$canPublish = true;
break;
default:
$canPublish = false;
}
?>
對於固定映射關係,陣列查表比 switch 更簡潔:
<?php
$weekMap = [
'Mon' => '週一', 'Tue' => '週二', 'Wed' => '週三',
'Thu' => '週四', 'Fri' => '週五', 'Sat' => '週六', 'Sun' => '週日'
];
echo $weekMap[date('D')] ?? '未知';
?>
| 場景 | 推薦結構 | 理由 |
|---|---|---|
| 2-3 個簡單條件 | if/else | 直觀易讀 |
| 多個離散值比較 | switch / match | 語意清晰,JIT 優化友善 |
| 範圍/複雜邏輯判斷 | if/elseif | 支援任意布林運算式 |
| 固定鍵值映射 | 陣列查表 | O(1) 查找,程式碼最少 |
| 狀態機/流程控制 | switch / 狀態模式 | 結構化管理狀態轉移 |
if/else 適合複雜邏輯與範圍判斷,switch 適合離散值多重分支,PHP 8.0+ 建議優先使用 match 表達式。實務上靈活組合、善用查表法與提早返回,能寫出既高效又優雅的條件控制程式碼。