PHP if...else 條件判斷

條件判斷讓程式可以根據不同的條件執行不同的程式碼。PHP 提供 ifelse ifelse 來實作條件判斷。

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 ifelseif 在 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 "未知錯誤";
}
?>