PhpStormのデバッグを使いこなす


他のIDEなどと同様、PhpStormにもデバッグの機能がデフォルトでついています。
[Evaluate Expression]という、デバッグを加速させてくれる便利な機能もあるので、それらの使い方も交えて紹介します。

ここではローカル環境上でXDebugを動かしてみます。
PhpStormを動かしているマシンへのXDebugのインストールが必須となります。
Macでのインストールや設定などはこちらが参考になります。

HomebrewでPhpStorm向けのPHP環境を構築する
http://qiita.com/makoto_kw/items/26ecf8fa5b04220c0174

また、リモート環境でのXDebugの設定は若干クセがあります。こちらが参考になります。
PHPのリモートデバッグ
http://qiita.com/tukiyo/items/6a5ee43c4bc812c82301

## デバッグしてみる

実際にコードを動かしながらデバッグしてみます。

```php
<?php
$fruits = ['one' => 'banana', 'two' => 'apple', 'three' => 'orange'];
$fruits2 = ['one' => 'banana', 'two' => 'kiwi', 'three' => 'grapefruits'];

$result1 = array_merge($fruits, $fruits2);
$result2 = $fruits + $fruits2;

$result1_sorted = sort($result1);
```

上記なようなコードがあった場合、$result1と$result2の変数の中身の違いをすぐに分かるでしょうか？
array_mergeと+演算子は微妙な違いがあります。こういう簡素なコードなら複数回実行して結果を見ても早いかもしれませんが、Databaseから取ってきた複雑な構造の配列の中身で同様なことをしようとした時に毎回実行させるのは面倒です。
そんなときにデバッグが役に立ちます。

5行目にBreakpointを張って、該当のPHPを実行します。
実行は[Run]-[Debug]で行けます。PHPのInterpreterが設定されていて、XDebugのインストールがされていれば、Breakpointが設定された箇所で止まります。

![debug.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/7b03c1a4-6f0f-da60-e9bb-6b2f70f75727.png "debug.php_-_candycane_-____www_candycane_.png")

下のDebugビューの中で、$fruitsと$fruits2、そして$_SERVERの変数が表示されています。
ここを展開することで変数の中身を確認したり、中身を書き換えたり出来ます。

とりあえずStep Over(F8)を2回押して進めてみます。

2つ進んだので、8行目までデバッグポインタが進んだかと思います。

![debug.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/ba320f5d-dd4e-2cdd-fa22-2c78e54724f6.png "debug.php_-_candycane_-____www_candycane_.png")

下の変数ビューの値も$result1と$result2が展開されていますね。
こんな風にコード上でブレイクポイントを張って、調査したい前後の箇所をステップ実行していくことで、わざわざprint debugをしなくても詳細なデバッグが行えます。

ステップ移動いくつか種類があります。それぞれこんな感じです。

- Step Into
  - 現在のステートメントから1つ先のステートメントに移動。現在のステートメントが関数呼び出しを含む場合、その関数の中にステップイン実行
- Step Over
  - 現在のステートメントから1つ先のステートメントに移動。現在のステートが関数呼び出しであってもその関数を呼び出さずに次のステートメントに移動
- Step Out
  - 現在の関数の外までステップ移動。関数が入れ子で呼び出されている場合は1つ上まで移動
- Run to Cursor
  カーソルの位置までステップ移動
- Resume Program
  - ブレイク状態を止め、プログラムを再開。更にブレイクポイントが張ってある場合はそこで停止

言葉にするとややこしいですが実際手を動かして見るとなんとなくわかるとおもいます。

基本的な実行は調査したいコードの前後にブレイクポイントを張って、停止したらStep Overで変数調査。
深い箇所やフレームワークの中を追っかけたい場合はStep Intoで中に入っていき、止めたい箇所でResume Programを押すような感じです。

変数の書き換えは変数ビューの書き換えたい値を右クリック→Set Value(もしくはF2)で書き換えが実行出来ます。

## コードを動的実行してみる

ブレイクポイントを張って停止しているときに、Evaluate Expression(Ctrl+F8)というコードを動的実行して結果を見れる機能が使えます。

もう一度、上記コードの8行目で停止している状態から再開してみます。

この状態のコードで$result1と$result2のarray_mergeした結果を確認したいとします。
上でも書きましたが、簡単なコードであれば再実行すれば良いだけの話ですが、前提条件があったりそもそも重い処理であった場合何回も実行出来ない場合もあります。だからこそのXDebugです。

ここでEvaluate Expression(Ctrl+F8)を実行して、以下のコードを入力してみましょう。

```php
array_merge($result1, $result2)
```

![Evaluate_Expression_と_debug.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/ad4fca89-d44d-e850-6121-aeb45202a12d.png "Evaluate_Expression_と_debug.php_-_candycane_-____www_candycane_.png")

このような結果になります。現在デバッガがいる地点で利用できる変数、及び関数を利用して動的に実行結果を取得することが出来ます。また、変数を書き換えた後に実行しても書き換え内容が反映された上で実行出来ます。

![Evaluate_Expression_と_debug.php_-_candycane_-____www_candycane_-5.png](https://qiita-image-store.s3.amazonaws.com/222/20074/bdc52b7a-5b99-c225-9d0f-e5806361918f.png "Evaluate_Expression_と_debug.php_-_candycane_-____www_candycane_-5.png")


Evaluate Expression を使いこなせればデバッグの幅が広がるので、かなり効率のよいデバッグが可能になります。

### 追記
ステップ実行のアクションで[Smart Step Into]を教えて頂きました。
カーソルの行内にメソッド呼び出しが複数ある場合に、どのメソッドの中に入りたいかを明示出来ます。これはこれで便利そうです！

![debug.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/6fd293dd-c1f0-9ae8-4e62-48efc14e3032.png "debug.php_-_candycane_-____www_candycane_.png")