PhpStormとXdebugでステップ実行  ②PhpStormの機能、使い方

**(2021/8/18追記：Xdebugはコードリーディングが辛いときに利用したくらいで、記事を投稿した時期以降は利用していません。コードを読むのに慣れてくるとXdebugが無くてもなんとかなります。Xdebugを利用すると動作が遅くなることがあるので、導入の際には十分検討してください。)**

長いので2つに分けました。
[PhpStormとXdebugでステップ実行 ①ステップ実行するための設定](https://qiita.com/haruna-nagayoshi/items/99fa041e884c2c3975d2)
PhpStormとXdebugでステップ実行  ②PhpStormの機能、使い方

## PhpStormの機能
ステップ実行をすると、ソースの深い部分まで簡単に追うことができます。
Laravelやその他ライブラリの深い部分まで読むと、理解が深まったり、バグ解決の助けになります。

### 基本
ステップ実行では、StepIntoやStepOutボタンを押しながらソースを追ったり、式の評価をすることができます。
PhpStormでステップ実行するときの基本的な使い方について、分かったことを説明します。
Step〇〇の違いについては、実際に使うのが一番理解が早いと思います。(例になるコードを書く気力がなかった...)

#### Step Over (F8)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/15f7dd24-363c-d316-3b50-99d729825779.png)
現在の行から1つ先の行に移動する。
現在の行で関数が呼び出されていても、その関数を呼び出さずに次の行に移動する。

#### Step Into (F7)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/a2627174-9cc6-2be2-ca36-9606e72234be.png)
現在の行から1つ先の行に移動する。
現在の行で関数が呼び出されている場合、その関数の中に進む。

#### Force Step Into (Alt + Shift + F7)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/b8ed36fe-9d00-ec77-7ea2-9e1066e3a174.png)
`Step Into`はコンストラクタ関数や、`ClassLoader.php`などのどうでもいいところをスキップする仕組みがあるのに対し、
`Force Step Into` の場合は、この設定を無視してスキップせずに全て実行出来る。つまり、`Step Into`よりも細かく見れる。

設定画面のこの部分で追加できるらしいですが、まだまともに設定したことがないので割愛。
デフォルトだと何も設定されておらず、その場合は`Step Into`と`Force Step Into` は同じ挙動...？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/5184018a-0124-549c-56d2-c1ec418f9b3b.png)

#### Step Out (Shift + F8)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/3a6b5b01-3890-bf0c-af4d-3fabe9ddd36c.png)
現在の関数の1つ外まで移動する。
`Step Into`で関数のなかに入ったあと`Step Out`すると、関数の呼び出し元に戻ることができる。

#### Run to Cursor (Alt + F9)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/999ac372-25a4-92c7-484e-7cd453679728.png)
カーソルが置いてある行まで実行し、カーソルが置いてある行で停止する。
Vimのプラグインを入れている場合、恐らくインサートモード状態でないとカーソルとして認識してくれない模様。なのであまり使っていない。

#### Evaluate Expression (Alt + F8)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/32cdcc24-93fd-13ea-5260-6d09a5c360f0.png)
デバッグ中に「ここで別のメソッド呼ぶとどうなるんだろう」と思ったら、
Evaluate Expressionボタンで、コードを動的実行した結果を見ることができる。
改めてコードを記述して再度ステップ実行を開始する必要はない。

Evaluate Expressionボタンを押すとウィンドウが開かれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/5587d2b5-f93f-110e-c206-fdb6886412b9.png)
`Expression:` に評価したい式を入力し、`Evaluate`ボタンを押すと、`Result:`に結果が表示される。
`Expression:` では入力補完が効いていて、インスタンスから呼び出せるメソッドやPHPの標準関数が補完される。
画像の例では、使いこなせていない私が適当に**Evaluate**したのでerrorで怒られています。

#### Resume Program (F9)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/5609d40d-5150-7e40-c365-d02806c39bb0.png)
中断していたプログラムを再開する。
さらにブレイクポイントを設定している場合は、そこで再度中断する。
ブレイクポイントからブレイクポイントへ飛べるイメージ。

### Tips
#### デバッグ中に変数の中身を書き換える
DebugウィンドウのVariablesタブに表示された変数を右クリック→`Set Variable` 
で変数の値を書き換えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/b23c6645-a3b9-cedd-ca33-ec38a62960cc.png)

#### デバッグ中に開かれたファイルを閉じたくない
ファイルをいくつも開いた状態で新たにファイルを開くと、最初に開いていたファイルが勝手に閉じられます。
ファイルのタブを右クリック→`Pin Tab` すると、勝手に閉じないようになります。(自分で閉じた場合は通常通り閉じます)
`Pin Tab` はデバッグに限らずいつでも使えます。

ステップ実行でプログラムを進めていくと該当ファイルが次々と開かれますが、
「このファイル、後で読み直したい！」というときは`Pin Tab` しておけば、あとで読み返せます。

↓Container.phpにピン留めのマークがついています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/b9ec80a3-c96e-958e-5238-96aa1e967460.png)

### 参考
[式の評価](https://pleiades.io/help/phpstorm/2019.2/evaluating-expressions.html)
[PhpStormのデバッグを使いこなす](https://qiita.com/Vexus2/items/333dbb0faf2d62777c9e)
[IntelliJ IDEAのデバッガのstep over, step into, force step into, step out, drop frame, run to cursor 機能の解説](https://qiita.com/takc923/items/35979a3ae68c9ad890df)
[AndroidStudioで覚えておくべきデバッグTIPS](https://qiita.com/FumihikoSHIROYAMA/items/e3159103ba2fba07e063)

## 他にも機能がたくさんあるけど調べきれない
使っていてわかったら書くかもしれない・・・。

### blade.phpでブレイクポイントを使う方法
デフォルトだと、blade.phpでブレイクポイントを設定しても、デバッグできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/589761ec-7e12-134a-e7f7-300d4690ffa8.png)
コードとして `xdebug_break();`を記述することで、ブレイクポイントの代用とするそうです。

Laravel5.7までは、コンパイル済みのbladeテンプレートのほうを参照するらしい。
[PhpStormの公式](https://pleiades.io/help/phpstorm/laravel.html)や[Laravel News](https://laravel-news.com/phpstorm-2019-1) で説明されている通り、Laravel5.8からはblade.phpに直接ブレイクポイントを設定できるとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/280cfaa3-e2a8-dc1c-89ef-80b805932fe6.png)

### ブレイクポイントの違い
公式の説明によると、[ブレイクポイント](https://pleiades.io/help/phpstorm/using-breakpoints.html)には3種類あるらしい。

### JavaScriptもデバッグできる
難しいjs書かないし、ブラウザの開発者ツールで十分なことが多いので需要はなさそう。
Node.jsならNode.js、Vue.jsならVue.jsのためのデバッグツールが存在するんだとしたらそれらを使うほうがいいのかも。

### 虫単体のマークと、虫+電話のマークの違い
違いがわからない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/def7ec76-e0c1-3194-444f-06ed1768273b.png)と ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/7ee0a6ae-5e57-4b16-3aa0-3d805bacf7ac.png)はそれぞれ「the Debug button」「the Active Debugger icon」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/015bc3c9-c699-245d-c025-f013e77b87a3.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/474268f7-a310-61ca-f8c9-02475b5bf508.png)はそれぞれ「start listening php debug connections」「stop listening php debug connections」と呼ぶらしい。
[PhpStormによるデバッグ: 基本ガイド](https://pleiades.io/help/phpstorm/debugging-with-phpstorm-ultimate-guide.html)や[PHP CLIスクリプトのデバッグ](https://pleiades.io/help/phpstorm/debugging-a-php-cli-script.html)を深く読めばわかるのかもしれない。

今まで  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/56e1ca6b-737b-231a-aba2-932ad9d33776.png) と  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/474268f7-a310-61ca-f8c9-02475b5bf508.png)にした状態(=両方ともON)でデバッグしていたが、
記事を書くために改めて調べているうち、  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/56e1ca6b-737b-231a-aba2-932ad9d33776.png)だけでデバッグ作動することに気づいた。
ブラウザの拡張機能を使うときに、受信デバッグマークをListen状態にしておくのかも。

### [ゼロコンフィギュレーションデバッグ](https://pleiades.io/help/phpstorm/zero-configuration-debugging.html)
公式ガイドに頻繁にでてくる。名前から察するに、「細かい設定いらずでデバッグできる」という意味？
[PhpStormによるデバッグ: 基本ガイド](https://pleiades.io/help/phpstorm/debugging-with-phpstorm-ultimate-guide.html)
公式だけでもこれだけ方法が書いてあるし、Qiitaなど個人の記事にもいろんなパターンがある。
今回の記事で説明した設定手順がベターかどうかもわからない。

### Xdebugでテストコードを分析

[Xdebugによるプロファイリング](https://pleiades.io/help/phpstorm/profiling-with-xdebug.html)
テストコードをほぼ書いたことがないのでどんな機能かはわからない。

　　

　　
[jquery-cropper](https://fengyuanchen.github.io/jquery-cropper/)で求めた座標・幅・高さの値をもとに、[Intervention Image](http://image.intervention.io/)で画像をトリミングする実装をしていて、それと同時にXdebugを使い始めました。
`dd()`や`var_dump()`を書く必要がないので、Intervention Imageの中身や自分が書いたコードをデバッグするのがとても楽で感動しました。
デバッグめんどうくさい...というひとは、ぜひXdebugで楽をしてほしいです。