Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

PhpStorm でコードを理解する (コードを実行する編)

コードを実行する

コードを見ただけでは、全体的に何をやっているのかわからない、ということがよくあると思う。 例えば、以下のコードは何を出力しているコードでしょうか? (変数名などは意図的に不親切な感じにしてある)

<?php
// nazono.php
function nazono() {
    $a = 0;
    $b = 1;
    for ($i = 1; $i <= 10; $i++) {
        $l = $a;
        $a = $b;
        $b += $l;
        print "$a\n";
    }
}
nazono();

プログラムを眺めただけで分かる人もいれば、ずっと見ていてもわからない人もいるかもしれない。 今回は、実行・デバッグしてみてプログラムを理解する方法について解説する。

Run 機能を使ってスクリプトを実行する

まず、新規プロジェクトを作成し、nazono.php を保存する。素朴にphpコマンドで実行してみると以下のように出力される。 10番目までのフィボナッチ数を出力するプログラムだった。(わかりにくくするために再帰を用いていない)

$ php nazono.php
1
1
2
3
5
8
13
21
34
55

PhpStormと連携するCLI環境をDockerで用意してからProjectパネルで nazono.php を右クリックし、「Run 」とRunパネルに以下のように表示される。

f:id:tenkoma:20190323181543p:plain
Docker環境でPHPスクリプトを実行する

ここまでは、少ない設定でPHPスクリプトが実行できるようになることを示したかっただけで、Debug 機能の説明で本題に入る。

Debug 機能でスクリプト実行中の状態を確認しながら実行する(デバッグ実行)

理解しづらいコードを、デバッグ機能を使ってプログラム実行中の状態を確認しながら理解する方法について説明する。もし、手元にPHPデバッグ環境がない場合はXdebugでデバッグできる最低限のWebサーバを用意するの手順で準備してほしい。

PHPプロジェクトの多くはWebプロジェクトなので、ブラウザからアクセスしてデバッグしてみる。

f:id:tenkoma:20190324145634p:plain
PhpStorm プロジェクトの状態

[Xdebugでデバッグできる最低限のWebサーバを用意する]で準備した状態は上記のようになっていて、docker-compose up -d でコンテナを起動し、 http://localhost:8000/nazono.php にアクセスすると以下のように表示される。

f:id:tenkoma:20190324150349p:plain
ブラウザから http://localhost:8000/nazono.php を実行

ではリモートデバッグしてみる。

  • PhpStorm右上のf:id:tenkoma:20190324150534p:plain:w28をクリックしf:id:tenkoma:20190324150530p:plain:w31の状態にする(Xdebugの通信を受け付ける状態にする)
  • nazono.php 10行目右側をクリックしを表示する(ブレークポイントを作る)

この状態でもう一度ブラウザからアクセスするとブレークポイント行背景が青くなり、プログラム実行が一時停止していることがわかる。

f:id:tenkoma:20190324172152p:plain
10行目でブレークしたところ

ブレークすると、Debugパネルで変数の状態を確認できる。またエディタ上で変数が変化したときにその行の右側に内容が表示される。

ループで実行されていることを理解するために、一時的に各ループごとの $i, $a, $b の値をログに残したくなったら、ログ機能がつかえる。

10行目のブレークポイントを右クリックして「More」を選ぶとダイアログが表示されるので以下のように入力する

f:id:tenkoma:20190324174520p:plain
Breakpointsダイアログ

  • 「Evaluate and log」をチェックし、"\$i=$i, \$a=$a, \$b=$b" と入力し、「Done」で閉じる

この状態でデバッグ実行すると、DebugパネルのConsoleタブに変数の状態が出力される。

f:id:tenkoma:20190324175328p:plain
Consoleパネル

ConsoleパネルはREPLを兼ねていて、任意のPHPコードをその場で実行できるし、コード補完も効く。

コードを実行しながらコードを読んでブレークしてさらにコードを実行する…そんな試行錯誤でコードを理解する機能になっている。

目次

次はテストコードを読む・書く編