PHPのデバッグ環境構築の備忘録（Xdebugの設定）②

この記事は、前回の[PHPのデバッグ環境構築の備忘録（Xdebugの設定）①](https://qiita.com/zoosa_uehara/items/e891808bd5eb3851574c)の続きとして、Xdebugを使ったデバッグ手順を実際のサンプルコードをもとに整理したものです。
自分で見直す用としてまとめていますが、同じ環境で開発する方の参考にもなれば嬉しいです。

## 検証環境

- PHP: 8.4.6
- Xdebug: 3.4.2
- Docker: 27.2.0
- Docker Compose: 2.29.2
- VS Code: 1.101.0
- Dev Containers: 0.417.0

### **Xdebugを使ったデバッグの方法まとめ**

---

### **1. 前提**

- 前回までで **Xdebug** のインストールと設定が完了しており、デバッグ環境が整っている状態。
- **VS Code** を使用してリモート開発を行っている。
- 今回の例では、`sample.php` というサンプルコードを用いてデバッグを行います。

---

### **2. サンプルコードの内容**

`sample.php` のコードでは、以下の処理を行います：

1. 配列 `$numbers = [1, 2, 3]` を用意。
2. 配列内の値を2倍にした新しい配列 `$doubleNumbers` を作成。
3. 最終的に `$doubleNumbers` の中身を `print_r` で出力。

**サンプルコード**

```php
<?php
$numbers = [1, 2, 3];
$doubleNumbers = [];
foreach ($numbers as $number) {
    $doubleNumbers[] = $number * 2;
}
print_r($doubleNumbers);

```

---

### **3. デバッグの開始手順**

1. **VS Codeでプロジェクトを開く**
    - VS Code のリモート開発機能を使い、プロジェクトを開く（例: `www/html` ディレクトリ）。
    - 必要に応じてターミナルで現在のファイルを確認（例: `ls` コマンドで `sample.php` を確認）。
2. **デバッグ機能を起動**
    - 左側の虫眼鏡マーク（デバッグアイコン）をクリック。
    - デバッグ構成（例: `Lesson 4: Xdebug`）を選択。
    - 実行ボタンを押してデバッグを開始。

---

### **4. デバッグの基本操作**

### **(1) ブレイクポイントの設定**

- ブレイクポイントとは、**コード実行を一時停止するポイント**です。
- `sample.php` の4行目（`foreach` 文の行）や10行目（`print_r` の行）にブレイクポイントを設定。

### **(2) プログラムの実行**

- デバッグモードでプログラムを実行。
- 実行すると、設定したブレイクポイントでコードの実行が一時停止します。

### **(3) 変数の確認**

- 停止した状態で、現在の変数の状態を確認できます。
    - **左側の変数ウィンドウ**:
        - 現在の変数やその値が一覧表示されます。
    - **デバッグコンソール**:
        - 変数名を入力して値を確認。
        - 例: `echo $numbers;` → 配列 `[1, 2, 3]` が表示される。

### **(4) ステップ実行**

- ステップ実行（コードを1行ずつ実行する機能）を使うことで、処理の流れを確認可能。
    - **「次のステップに進む」ボタン**を押して、1行ずつコードを実行。
    - 各ステップで変数の中身を確認。

---

### **5. デバッグの流れの例**

### **(1) 4行目のブレイクポイント**

- ブレイクポイントに到達した時点で、以下の変数の状態を確認：
    - `$numbers` → `[1, 2, 3]`
    - `$doubleNumbers` → `null`（まだ初期化されていない）。

### **(2) ステップ実行**

- `foreach` のループを1回ずつ実行することで、`$doubleNumbers` に2倍の値が追加されていく様子を確認。
    - 1回目: `$doubleNumbers` → `[2]`
    - 2回目: `$doubleNumbers` → `[2, 4]`
    - 3回目: `$doubleNumbers` → `[2, 4, 6]`

### **(3) 10行目のブレイクポイント**

- 配列 `$doubleNumbers` の最終的な値（`[2, 4, 6]`）を確認。

---

### **6. デバッグコンソールの使い方**

デバッグコンソールでは、以下の操作が可能です：

- **変数の値を確認**
    - 入力: `$numbers` → 出力: `[1, 2, 3]`
    - 配列の特定の要素を確認: `$numbers[0]` → 出力: `1`
- **簡単なコードの実行**
    - 例: `$sum = array_sum($numbers);` → `$sum` が計算される。

---

### **7. デバッグを終了する方法**

- デバッグ終了後は、以下のいずれかの方法で処理を再開または停止します：
    - **続行ボタン（再開）**: 残りのコードを一気に実行し終了。
    - **停止ボタン**: デバッグを完全に停止。

---

### **8. デバッグのメリット**

- **エラーの正確な特定**:
    - どの行でエラーが発生しているか、変数の値を確認することで特定可能。
- **コードの動作を詳細に把握**:
    - ステップ実行を使って、コードが意図通りに動作しているか確認。
- **効率的なデバッグ**:
    - 従来の `var_dump()` や `print_r()` を多用する手法に比べ、効率的かつ直感的に問題を解決可能。

---

### **9. 注意点**

- **Xdebugの設定確認**:
    - 正しく動作しない場合、`php.ini` で Xdebug の設定が有効になっているか確認。
    - 必要な設定例:
        
        ```
        zend_extension=xdebug
        xdebug.mode=debug
        xdebug.start_with_request=yes
        xdebug.client_host=127.0.0.1
        xdebug.client_port=9003
        
        ```
        
- **VS Codeのデバッグ設定**:
    - `.vscode/launch.json` に適切な設定が必要。
    - 例:
        
        ```json
        {
          "version": "0.2.0",
          "configurations": [
            {
              "name": "Listen for Xdebug",
              "type": "php",
              "request": "launch",
              "port": 9003
            }
          ]
        }
        
        ```
        

---

### **10. まとめ**

1. **デバッグの流れ**:
    - ブレイクポイントを設定 → プログラム実行 → ステップ実行で状態確認 → 問題箇所を特定。
2. **Xdebugの利点**:
    - 手動でデバッグ用コードを記述する必要がなく、効率的にコードの動作確認が可能。
3. **VS Codeとの統合**:
    - VS Code内でデバッグ操作、ターミナル操作、変数確認が一括で行える。

---

以上が、Docker × VS Code × Xdebug を使ったPHPデバッグ環境の構築手順です。
独学でつまずいたポイントや設定の流れを、自分でも見返せるようにまとめました。
環境構築やデバッグで悩んでいる方の参考になれば幸いです。