PHP if...else 條件判斷
條件判斷讓程式可以根據不同的條件執行不同的程式碼。PHP 提供 if、else if 和 else 來實作條件判斷。
if 語法
當條件為 true 時執行程式碼:
<?php
$age = 20;
if ($age >= 18) {
echo "你已經成年了";
}
?>
if...else 語法
當條件為 true 時執行一段程式碼,否則執行另一段:
<?php
$age = 15;
if ($age >= 18) {
echo "你已經成年了";
} else {
echo "你還未成年";
}
?>
if...else if...else 語法
處理多個條件:
<?php
$score = 85;
if ($score >= 90) {
echo "A 優秀";
} else if ($score >= 80) {
echo "B 良好";
} else if ($score >= 70) {
echo "C 及格";
} else if ($score >= 60) {
echo "D 尚可";
} else {
echo "F 不及格";
}
// 輸出:B 良好
?>
else if 和 elseif 在 PHP 中是等價的,都可以使用。巢狀 if
if 可以巢狀使用:
<?php
$age = 25;
$hasLicense = true;
if ($age >= 18) {
if ($hasLicense) {
echo "你可以開車";
} else {
echo "你需要先取得駕照";
}
} else {
echo "你還不能考駕照";
}
?>
使用邏輯運算子可以簡化巢狀:
<?php
if ($age >= 18 && $hasLicense) {
echo "你可以開車";
} else if ($age >= 18 && !$hasLicense) {
echo "你需要先取得駕照";
} else {
echo "你還不能考駕照";
}
?>
單行 if
如果只有一行程式碼,可以省略大括號(但不建議):
<?php
$isRaining = true;
// 可以省略大括號
if ($isRaining)
echo "記得帶傘";
// 寫成一行
if ($isRaining) echo "記得帶傘";
// 建議還是使用大括號,提高可讀性
if ($isRaining) {
echo "記得帶傘";
}
?>
三元運算子 (Ternary Operator)
三元運算子是 if...else 的簡寫形式:
<?php
$age = 20;
// 使用 if...else
if ($age >= 18) {
$status = "成年";
} else {
$status = "未成年";
}
// 使用三元運算子
$status = ($age >= 18) ? "成年" : "未成年";
echo $status; // 成年
?>
三元運算子的簡化
當 true 的值和條件相同時,可以省略中間的值:
<?php
$name = "";
// 完整寫法
$displayName = $name ? $name : "Guest";
// 簡化寫法(省略中間值)
$displayName = $name ?: "Guest";
echo $displayName; // Guest
?>
巢狀三元運算子
可以巢狀使用(但可讀性較差):
<?php
$score = 85;
// 不建議這樣寫,可讀性差
$grade = ($score >= 90) ? "A" : (($score >= 80) ? "B" : (($score >= 70) ? "C" : "D"));
echo $grade; // B
?>
PHP 8 之後,巢狀三元運算子需要使用括號明確指定優先順序,否則會報錯。
Null 合併運算子 (??)
?? 運算子檢查值是否為 null 或未定義:
<?php
// 檢查變數是否存在
$name = $_GET['name'] ?? 'Guest';
// 等同於
$name = isset($_GET['name']) ? $_GET['name'] : 'Guest';
// 可以串連
$name = $_GET['name'] ?? $_POST['name'] ?? $_SESSION['name'] ?? 'Guest';
// ??= 賦值運算子 (PHP 7.4+)
$settings = [];
$settings['theme'] ??= 'default'; // 如果是 null,設為 'default'
?>
?? vs ?:
<?php
$empty = "";
$zero = 0;
$false = false;
$null = null;
// ?? 只檢查 null 和未定義
echo $empty ?? 'default'; // "" (空字串不是 null)
echo $zero ?? 'default'; // 0 (0 不是 null)
echo $false ?? 'default'; // false 不是 null,但輸出為空
echo $null ?? 'default'; // default
// ?: 檢查假值 (falsy values)
echo $empty ?: 'default'; // default
echo $zero ?: 'default'; // default
echo $false ?: 'default'; // default
echo $null ?: 'default'; // default
?>
替代語法
在 HTML 模板中,可以使用替代語法讓程式碼更易讀:
<?php $isLoggedIn = true; ?>
<?php if ($isLoggedIn): ?>
<p>歡迎回來!</p>
<?php else: ?>
<p>請登入</p>
<?php endif; ?>
完整的替代語法:
<?php if ($condition): ?>
<!-- HTML 內容 -->
<?php elseif ($anotherCondition): ?>
<!-- HTML 內容 -->
<?php else: ?>
<!-- HTML 內容 -->
<?php endif; ?>
常見的條件判斷情境
檢查變數是否存在
<?php
// 檢查是否設定且不為 null
if (isset($name)) {
echo $name;
}
// 檢查是否為空(包含 0, "", null, false, [])
if (empty($name)) {
echo "名稱為空";
}
// 檢查是否不為空
if (!empty($name)) {
echo $name;
}
?>
檢查陣列
<?php
$items = ['apple', 'banana'];
// 檢查陣列是否有元素
if (count($items) > 0) {
echo "有 " . count($items) . " 個項目";
}
// 簡化寫法
if ($items) {
echo "陣列不為空";
}
// 檢查值是否在陣列中
if (in_array('apple', $items)) {
echo "有蘋果";
}
// 檢查鍵是否存在
$user = ['name' => 'Alice', 'age' => 25];
if (array_key_exists('email', $user)) {
echo $user['email'];
} else {
echo "沒有 email";
}
?>
檢查字串
<?php
$email = "user@example.com";
// 檢查字串長度
if (strlen($email) > 0) {
echo "Email 不為空";
}
// 檢查字串是否包含子字串
if (str_contains($email, '@')) { // PHP 8+
echo "Email 包含 @";
}
// PHP 7 的寫法
if (strpos($email, '@') !== false) {
echo "Email 包含 @";
}
?>
檢查數字範圍
<?php
$age = 25;
// 檢查範圍
if ($age >= 18 && $age <= 65) {
echo "在工作年齡範圍內";
}
// 使用 match 表達式 (PHP 8+)
$category = match (true) {
$age < 13 => "兒童",
$age < 20 => "青少年",
$age < 60 => "成年",
default => "老年",
};
?>
實際應用範例
表單驗證
<?php
$errors = [];
if (empty($_POST['name'])) {
$errors[] = "名稱不能為空";
}
if (empty($_POST['email'])) {
$errors[] = "Email 不能為空";
} else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errors[] = "Email 格式不正確";
}
if (empty($_POST['password'])) {
$errors[] = "密碼不能為空";
} else if (strlen($_POST['password']) < 8) {
$errors[] = "密碼至少需要 8 個字元";
}
if (empty($errors)) {
echo "表單驗證通過";
} else {
foreach ($errors as $error) {
echo "<p class='error'>$error</p>";
}
}
?>
權限檢查
<?php
$user = [
'role' => 'admin',
'active' => true
];
if (!$user['active']) {
echo "帳號已被停用";
} else if ($user['role'] === 'admin') {
echo "歡迎,管理員!";
} else if ($user['role'] === 'editor') {
echo "歡迎,編輯者!";
} else {
echo "歡迎,一般使用者!";
}
?>
API 回應處理
<?php
$response = [
'status' => 200,
'data' => ['user' => 'Alice']
];
if ($response['status'] === 200) {
echo "成功:" . $response['data']['user'];
} else if ($response['status'] === 404) {
echo "找不到資源";
} else if ($response['status'] >= 500) {
echo "伺服器錯誤";
} else {
echo "未知錯誤";
}
?>