PHP発展編: 条件分岐を使いこなそう

このページは独学エンジニアという学習サイトで学んだ条件分岐のポイントをまとめた、自分用の備忘録です。

条件分岐はプログラムの挙動を制御する重要な要素なので、
読みやすくバグの少ない書き方を身につけることを目指します。

https://dokugaku-engineer.com/course/serverside

---

## **1. 条件分岐を使いこなす重要性**

条件分岐は、プログラムの挙動を決定する上で非常に重要です。しかし、適切に書かないと以下の問題が発生します：

- **可読性の低下**:
    - 他の開発者がコードを理解しづらくなる。
- **バグの発生**:
    - 特に分岐が複雑になるとバグが発生しやすい。
- **バグの発見が困難**:
    - 条件分岐の処理ミスが原因のバグは気づきにくい。

これらを防ぐために、「**読みやすく、バグの少ない条件分岐**」を書くことを目指します。

---

## **2. if 文の使い方**

### **(1) 正常ケースを先に、エラーケースを後に書く**

- **理由**:
    - 読む人がスムーズに流れを理解できる。
    - エラー処理が目立ちすぎない。
- **例: 改善前（エラーケースと正常ケースが混在）**
    
    ```php
    $connection = mysqli_connect(...);
    if (!$connection) {
        // エラー処理
        echo "接続エラー";
        return;
    }
    
    $result = mysqli_query($connection, $query);
    if (!$result) {
        // エラー処理
        echo "クエリエラー";
        return;
    }
    
    $data = mysqli_fetch_assoc($result);
    // 正常処理
    
    ```
    
- **例: 改善後（正常ケースを先に書く）**
    
    ```php
    $connection = mysqli_connect(...);
    if ($connection) {
        $result = mysqli_query($connection, $query);
        if ($result) {
            $data = mysqli_fetch_assoc($result);
            // 正常処理
        } else {
            // クエリエラーの処理
            echo "クエリエラー";
        }
    } else {
        // 接続エラーの処理
        echo "接続エラー";
    }
    
    ```
    

---

### **(2) else を適切に使う**

- **else を使わない落とし穴**:
    - 初心者は else を省略しがちだが、エラーケースを考慮しないとシステムダウンや思わぬ挙動を引き起こす。
    - すべてのケースに対応しているか、else を使って確認する。
- **例: else を省略している例**
    
    ```php
    if ($connection) {
        $result = mysqli_query($connection, $query);
        // エラーケースが未対応
    }
    
    ```
    
- **改善: else を使ってエラー処理を追加**
    
    ```php
    if ($connection) {
        $result = mysqli_query($connection, $query);
        if ($result) {
            $data = mysqli_fetch_assoc($result);
        } else {
            echo "クエリエラー";
        }
    } else {
        echo "接続エラー";
    }
    
    ```
    

---

### **(3) 条件と処理が逆になっていないか確認**

- **問題例**:
    
    ```php
    if (!$connection) {
        // 正常処理を記述してしまう
        echo "接続成功";
    } else {
        // エラー処理
        echo "接続エラー";
    }
    
    ```
    
- **改善**:
    
    ```php
    if ($connection) {
        echo "接続成功";
    } else {
        echo "接続エラー";
    }
    
    ```
    

---

### **(4) 複雑な条件式は関数化する**

- 複雑な条件式は読みにくく、理解が困難。
- 条件式を関数化して簡潔に書く。
- **例: 改善前（複雑な条件式）**
    
    ```php
    if ($inputStatus === 'complete' && $paymentStatus === 'paid' && $date > $deadline) {
        // 処理
    }
    
    ```
    
- **例: 改善後（条件式を関数化）**
    
    ```php
    if (isPaymentComplete($inputStatus, $paymentStatus, $date)) {
        // 処理
    }
    
    function isPaymentComplete($inputStatus, $paymentStatus, $date) {
        return $inputStatus === 'complete' && $paymentStatus === 'paid' && $date > $deadline;
    }
    
    ```
    

---

### **(5) 一般的なケースを先に、レアケースを後に書く**

- 一般的な処理を先に書くことで、コードが読みやすくなる。
- **例: 入力値のバリデーション**
    
    ```php
    if (!is_string($name)) {
        echo "名前は文字列である必要があります";
    } elseif (!ctype_alpha($name)) {
        echo "名前はアルファベットのみです";
    } elseif (strlen($name) > 100) {
        echo "名前は100文字以内で入力してください";
    } else {
        echo "入力値は正常です";
    }
    
    ```
    

---

## **3. switch 文の使い方**

### **(1) ケースの順番に注意**

- 一般的なケースを先頭に持ってくる。
- アルファベット順や数値順に並べるとさらに分かりやすい。
- **例: 改善後の switch 文**
    
    ```php
    switch ($status) {
        case 'active':
            echo "アクティブです";
            break;
        case 'inactive':
            echo "非アクティブです";
            break;
        case 'suspended':
            echo "停止されています";
            break;
        default:
            echo "ステータス不明";
    }
    
    ```
    

### **(2) デフォルトの使い方**

- 指定できないケース（その他）をデフォルトで記述。
- デフォルトを他のケースの代わりに乱用しない。

---

### **(3) 処理が長い場合は関数化**

- 各ケースの中の処理が長い場合は関数にまとめる。
- **例: 改善後**
    
    ```php
    switch ($status) {
        case 'active':
            handleActiveStatus();
            break;
        case 'inactive':
            handleInactiveStatus();
            break;
        default:
            handleUnknownStatus();
    }
    
    function handleActiveStatus() {
        echo "アクティブです";
    }
    
    function handleInactiveStatus() {
        echo "非アクティブです";
    }
    
    function handleUnknownStatus() {
        echo "ステータス不明";
    }
    
    ```
    

---

## **4. 今回のまとめ**

1. **if 文のポイント**:
    - 正常ケースを先に、エラーケースを後に書く。
    - else を省略せず、すべてのケースをカバー。
    - 条件式が複雑な場合は関数化。
    - 一般的なケースを先に書き、レアケースを後に書く。
2. **switch 文のポイント**:
    - 一般的なケースを先頭に持ってくる。
    - デフォルトは「その他のケース」のみに使う。
    - 各ケースの処理が長い場合は関数化。
3. **共通の注意点**:
    - 条件式や処理の順番に注意し、正しい動作を保証する。
    - 読みやすいコードを書くことで、バグを減らし、他の開発者が理解しやすくする。


---
整理した内容は以上です。
この記事がPHPを学んでいる方の理解を助け、学習の一助になれば幸いです。