首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 流程控制基礎:if 條件判斷語法、巢狀陷阱與重構技巧

     編輯:PHP 綜合知識

if 語句核心語法

if (條件表達式) {
    // 條件評估為 true 時執行的程式碼區塊
}

條件表達式 會被轉型為布林值:

  • true:非空字串、非零數字、非空陣列、物件、true
  • false:''、0、0.0、'0'、[]、null、false

實戰範例:簡易登入驗證

版本 1:單一 if(原始教學碼)

<?php
// 假設表單送出 $_POST['name'] = 'neo'
$name = $_POST['name'] ?? '';

if ($name === 'neo') {
?>
    <p>歡迎進入母體,Neo。</p>
    <p>或許是武力強迫你才這樣做的...</p>
<?php
}
// 缺點:未處理失敗情況,使用者看不到任何回饋
?>

版本 2:雙重 if(教學進階碼)

if ($name === 'neo') {
    // 成功訊息
}

if ($name !== 'neo') {  // 邏輯重複,維護困難
    // 失敗訊息
}

版本 3:if-else 正確寫法(推薦)

if ($name === 'neo') {
?>
    <p>歡迎進入母體,Neo。</p>
<?php
} else {
?>
    <p>我想知道你是否聽說過莎士比亞,<?= htmlspecialchars($name) ?>.</p>
    <p>對於你,很不幸,我不同意。拒絕進入!</p>
<?php
}

巢狀 if 的陷阱與重構

❌ 過度巢狀(箭頭型代碼)

if ($day === 'Thursday') {
    if ($time === '12') {
        if ($place === 'Italy') {
            $lunch = 'pasta';
        }
    }
}

✅ 衛語句扁平化

function decideLunch(string $day, string $time, string $place): ?string {
    if ($day !== 'Thursday') return null;
    if ($time !== '12') return null;
    if ($place !== 'Italy') return null;
    
    return 'pasta';
}

✅ 邏輯合併(當條件獨立時)

if ($day === 'Thursday' && $time === '12' && $place === 'Italy') {
    $lunch = 'pasta';
}

比較運算子完整對照表

運算子名稱範例結果說明
==相等'5' == 5true型別轉換後比較(鬆散)
===全等'5' === 5false型別與值皆相同(嚴格)⭐推薦
!= / <>不相等'5' != 5false鬆散比較
!==不全等'5' !== 5true嚴格比較 ⭐推薦
>大於10 > 5true
<小於10 < 5false
>=大於等於10 >= 10true
<=小於等於10 <= 10true
<=>太空船1 <=> 2-1PHP 7+:-1/0/1 代表小於/等於/大於

常見新手錯誤與除錯

1. 指派誤寫成比較

if ($status = 'active') {  // 永遠為 true,且 $status 被改寫
    // ...
}

// 正確
if ($status === 'active') { ... }

// 防禦性寫法:常數放左邊(Yoda 條件,現代較不推薦,靠靜態分析即可)
if ('active' === $status) { ... }

2. 字串與數字比較陷阱

'123abc' == 123   // true ⚠️ 字串轉數字截取前導數字
'123abc' === 123  // false ✅

// 實務建議:輸入驗證階段即轉型
$id = (int)($_GET['id'] ?? 0);
if ($id > 0) { ... }

3. 空值處理

$name = $_GET['name'] ?? '';  // 預設空字串而非 null

if ($name) { ... }  // 空字串為 false,行為符合預期

// PHP 8+ 可用 match 簡化多條件
$role = match (true) {
    $user->isAdmin() => 'admin',
    $user->isEditor() => 'editor',
    default => 'guest',
};

最佳實踐檢查清單

  • ☐ 優先使用 ===/!== 嚴格比較
  • ☐ 複雜條件提煉為具名函式:if ($user->canPublish())
  • ☐ 使用衛語句減少巢狀層級(目標 ≤ 2 層)
  • ☐ 邊界值測試:0、''、[]、null、false
  • ☐ 靜態分析工具(PHPStan Level 5+)檢查型別安全

延伸閱讀

掌握 if 條件判斷的精髓,是寫出健壯、可維護 PHP 程式碼的第一步。下一篇將介紹 switch、match 多重分支與迴圈控制結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved