前提
デザインパターンがなく、自由に設計された古い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);
で出力されます。