流程控制是程式邏輯的骨架。PHP 提供豐富的控制結構,包含條件判斷、迴圈、跳脫語句與檔案包含機制。本文系統整理各類語法、執行流程、常見陷阱與最佳實踐,並附上可直接執行的範例程式碼。
if、switch — 依條件決定執行路徑while、do-while、for、foreach — 重複執行此外尚有 跳脫語句 (break, continue, return) 與 檔案包含 (include, require)。
if 系列// 單行 (不建議,易讀性差)
if ($a > 0) echo 'positive';
// 區塊式 (推薦)
if ($score >= 60) {
echo '及格';
} elseif ($score >= 40) {
echo '補考';
} else {
echo '不及格';
}
// 替代語法 (適合模板檔)
if ($loggedIn):
echo '歡迎回來';
else:
echo '請登入';
endif;
switch 多重分支switch ($action) {
case 'create':
createRecord();
break; // 關鍵:避免貫穿
case 'update':
updateRecord();
break;
case 'delete':
deleteRecord();
break;
default:
throw new Exception('未知操作');
}
注意:switch 使用鬆散比較 (==),case '1' 會匹配 $var = 1。嚴格比較請用 if 串聯 ===。
match 運算式 (PHP 8.0+)更嚴格、可返回值、無貫穿問題:
$message = match ($status) {
200 => '成功',
404 => '找不到',
500 => '伺服器錯誤',
default => '未知狀態',
};
| 迴圈類型 | 判斷時機 | 適用場景 | 語法範例 |
|---|---|---|---|
while | 先判斷後執行 (前測試) | 次數未知、依條件重複 | while ($row = $stmt->fetch()) { ... } |
do-while | 先執行後判斷 (後測試) | 至少執行一次 (如選單) | do { showMenu(); } while ($input != 'q'); |
for | 三段式控制 | 已知次數、計數器邏輯 | for ($i=0; $i<10; $i++) { ... } |
foreach | 專為陣列/可迭代物件 | 遍歷陣列、物件屬性 | foreach ($arr as $k => $v) { ... } |
foreach 兩種語法$data = ['a' => 1, 'b' => 2];
// 僅取值
foreach ($data as $value) { ... }
// 取鍵值對
foreach ($data as $key => $value) { ... }
// 參考傳遞修改原陣列
foreach ($data as &$value) { $value *= 2; }
unset($value); // 重要:解除參考,避免後續誤用
| 關鍵字 | 作用範圍 | 行為 | 支援層級跳脫 |
|---|---|---|---|
break | for, foreach, while, do-while, switch | 立即結束**整個**迴圈/分支 | break 2; 跳出兩層 |
continue | for, foreach, while, do-while | 結束**本次**迴圈,進入下一次判斷 | continue 2; 跳過兩層外層的本次迴圈 |
return | 函式、方法、include 檔案 | 結束函式/檔案執行,返回值 | 不適用 |
for ($i=1; $i<=5; $i++) {
if ($i === 3) continue; // 跳過 3
if ($i === 5) break; // 結束迴圈
echo $i; // 輸出: 1 2 4
}
| 語句 | 載入時機 | 找不到檔案 | 重複包含 | 回傳值 |
|---|---|---|---|---|
include | 執行到該行 | 發出 E_WARNING,繼續執行 | 每次都包含 | 包含檔案的 return 值 (預設 1) |
require | 腳本啟動時 (編譯階段) | 發出 E_COMPILE_ERROR,**終止腳本** | 每次都包含 | 同 include |
include_once | 執行到該行 | 同 include | **僅包含一次** | 同 include (第二次回傳 true) |
require_once | 腳本啟動時 | 同 require | **僅包含一次** | 同 require |
require_once — 必須存在、不可重複載入include — 允許動態決定、缺失不致命require_once 或 include_once — 防止函式重複定義錯誤// 使用 __DIR__ 確保相對於當前檔案位置
require_once __DIR__ . '/../config/database.php';
// 避免使用相對路徑 (./, ../) 直接在 include 中,易因執行目錄不同而失效
| 錯誤現象 | 可能原因 | 解決方案 |
|---|---|---|
| 迴圈無限執行 | 條件變數未更新、continue 導致計數器不遞增 | 檢查迴圈體內所有 continue 路徑是否會更新計數器 |
switch 貫穿執行 | 漏寫 break | 習慣每個 case 結尾加 break,或改用 match |
foreach 修改失效 | 未使用參考 &$v 或修改的是複製品 | 需修改原陣列時用 foreach ($arr as &$v) |
| 包含檔案變數污染 | 包含檔案使用相同變數名稱 | 包含檔案內部用函式封裝、或使用命名空間 |
流程控制看似基礎,實則是程式邏輯清晰度與正確性的保證。熟練掌握各類判斷、迴圈的語義差異、跳脫機制與包含策略,能讓您寫出結構清晰、易於維護、效能優異的 PHP 程式碼。建議在專案中制定編碼規範(如:統一使用大括號、優先 foreach 遍歷陣列、核心依賴用 require_once),並善用靜態分析工具 (PHPStan, Psalm) 捕捉潛在邏輯錯誤。