1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPのコードを読み解き、処理の流れを追う方法

Last updated at Posted at 2023-04-20

前提

デザインパターンがなく、自由に設計された古いPHPのソースコードを読み解くのに苦戦しています。
そんなソースコードを読み解く際に使った方法をまとめました。

1.ひたすらvar_dump() や print_r() する

基本中の基本の方法は、よく分からないソースコードのいろいろな部分にvar_dump()print_r() へ変数名や配列名を入れたり、またはecho('ここを処理が通ってる')みたいなコメント?を記述して、出力されるかどうかテストします。

ただ、配列をvar_dump()すると改行無しで出力されてしまうので見づらいです。
以下のように、上下に<pre>をechoさせると整形されて出力されます。

echo '<pre>';
var_dump($foo);
echo '</pre>';

読んでいる機能を一巡させると余計に訳がわからなくなる場合は、必要に応じてexit;をいれて処理自体を止めてみることも有用です。その場合、var_dump()の後にexit;を入れて処理を止めましょう。

ちなみにexit; はソースコードの実行を終了するための命令なので、exit; の後に書かれたコードは実行されません。
var_dump();exit;の前に記述しましょう。

スタックトレースを活用して処理の流れを出力する

スタックトレースは、関数やメソッドの呼び出し元やその順番を示したものです。

ソースコードの、よくわからない関数があったとします。呼び出し元も不明の場合、スタックトレースを出力させると処理の流れわかりやすいです。

知りたい処理の手前に、以下を記述しましょう。

$trace = debug_backtrace();
var_dump($trace);

// 調べたい処理の塊がここに入ります

調べたい処理の手前に置くことがポイントです。
debug_backtrace() 関数は、その呼び出し時点でのスタックトレースを取得するので、調べたい処理の後に記述すると、その処理のスタックトレースは出力されません。

ちなみに出力先はWebアプリケーションの場合はブラウザの画面に出てきます。
なお、このdebug_backtrace()は重い作業のようなので、必ず本番にリリースするコードからは削除、またはコメントアウトしておきましょう。

また、もしエラーが出ている処理の流れを追いたい場合は、以下のように、try-catchを記述します。

try {
    // エラーが出るコードをここに記述
} catch (Exception $e) {
    $trace = $e->getTrace();
    var_dump($trace);
}

こうすると、 例外はchachの引数にあるExceptionクラスの変数eに入り、getTrace()によってスタックトレースが取得され、最後var_dump($trace);で出力されます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?