PHPで上手にデバッグして効率のよい開発を身につけよう
PHPでの開発では、こまめに自分の書いたコードが正しく機能しているかどうかを確認するのはとても大切です。また、思った通りに動作していないとわかったときに、どこが間違っているのかをいち早く突き止めることができる能力も、開発のためには必要です。
この記事では、PHPのコーディングの際に、どのようにデバッグをしながら進めていけるかを解説します。
PHPでデバッグをする意味
変数がどうなっているかを確かめる
PHPでの開発でコーディング作業をしているときに、デバッグをすることはとても大切です。「エラーがあることがわかってから」だけがデバッグのタイミングというわけではないのです。
エラーになってしまう前から、思っている通りに正しく動いているかをきちんと確認しながらコーディング作業を進める癖をつけましょう。
たとえば、なにかの計算をした変数は、思った通りになっているかを確認するとよいでしょう。
思った通りになっていなくても、エラーになるわけではないというケースも多く存在します。なんらかの返り値を得るコードを書いたときに、その場で、思った通りの動作をしているか、いくつか条件を変えながら、確認するようにできます。そうすると、コードを書き進んでから、あとで間違いが発覚して巻き戻しながら間違いが発生した箇所を探すという無駄な時間を省略できるようになるのです。
どこにエラーがあるのかわからないという状態は、プログラマーに相当のストレスを与えてしまいますから、ぜひそうならないようにしましょう。
エラーの箇所を見極める
もし、書いたコードが思ったように動作せず、エラーとなってしまったなら、デバッグをしてエラーの箇所を見極めるようにしましょう。
エラーの情報が表示されないようにしている環境でも開発することがあり、どこまでプラグラムを通っているのかさえもわからないということがあります。
画面になにかの文字が出力させるコードを書き足して、その文字が表示されるなら、コードのその位置までは、プログラムのエラーがないことがわかります。エラーが出ずに書き足したコードがちゃんと表示されるなら、書き足したコードを削除して、コードのもう少し後ろのところにもう一度デバッグ用のコードを書き足します。このようにして、どこまでプログラムが走ることができているのかを精査できるのです。
プログラムがコードをどう辿っているかを理解する
オブジェクト指向の言語ですからいろんなプラグラムを通っていくことも多く、いざエラーが発生してしまったときに、どこがどうなっているのかもわからないということもありえます。
そんなときには、プログラムがどんな経路をたどってそのコードの位置にいるのかを知るための関数を使って、デバッグすることもできます。新しく使いはじめたライブラリの中身を調べてみたいというときにも使えます。
このようにコーディング作業をするときには、がむしゃらに書きすすんでいきたいという思いにいったん待ったをかけて、自分が書いたコードが自分の思った通りになっているかをこまめに確認しながら進めていくようにしましょう。
長年コーディングに携わっているというベテランでも、デバッグなしですいすいと書きすすめるわけではありません。どこかで、思ってもいないような挙動をさせてしまったりすることはコーディングにはつきものなのです。確実に効率よくすすめていくためには、どうしても上手にデバッグをこなすことが欠かせないのです。
PHPのデバッグの仕方
var_dumpを使う
PHPのデバッグの基本はvar_dump関数です。この関数によって、変数の中身を知ることができます。SESSIONの中身など、配列の変数が多次元になっているような複雑な情報でも、var_dumpですぐに中身を出力してくれます。
var_dumpとするだけで、変数が配列であったとしても、そのキーと値はもちろん、値の型についての情報も返してくれるのです。
さらに、変数の中身を見やすくするために、多次元配列の中身をテーブル構造で表示させるという方法もあります。
<?php
$arr = array(array(array(1,2,3,4),array(5,6,7)),8,9,10);
var_dump($arr);
debug("arr",$arr);
function debug($name, $value) {
echo "<table>";
foreach($value as $k => $v) {
echo "<tr><td>{$k}</td><td>";
if(is_array($v)) {
debug($k, $v);
} else {
echo $v;
}
echo "</td></tr>";
}
echo "</table>";
}
?>
これは、SESSION変数などの、多重の構造になることが多い変数の中身をスマートにチェックできるちょっとしたツールです。
配列のキーと値を出力するだけのコードに、もし値が配列なら、関数自身を再帰的に呼び出して、値内の配列のキーと値を書き出せるようになっているものです。var_dumpだけだと見にくくなってしまいますが、このヘルパー関数を使えば、もっと変数をチェックしやすくなります。
var_dumpが使える別のシチュエーションは、どこでエラーが発生しているかということから調べなければならないという環境です。プログラムが通っていると思ういろんな箇所のコードに、var_dumpを仕込んでいきます。引数には、それぞれ違う数字を入れたりして、コードと出力された結果を比べやすくしておきます。
var_dump(1);
//exit();
var_dump(2);
exit();
var_dumpとexitを一緒に使って、書き出した後にプログラムをストップさせます。
「1」が表示できるなら、1の箇所までは、プログラムが走っているということです。
1のところの、exitを削除して、2までプログラムが走るかどうかを確認します。
2が表示されるなら、順々にどこまでプログラムが走っているのかをチェックしていきます。
数字が表示されないvar_dumpがあれば、その前にあるvar_dumpからそのvar_dumpまでの間に、なんらかのエラーが潜んでいるということになります。
このようにして、プログラムの全体のなかから、どの位置にデバッグすべきエラーがあるのかを調査することができるのです。
debug_backtraceを使う
最後にdebug_backtraceの使い方をご紹介します。
debug_backtraceは、返り値に連想配列の配列を返します。
連想配列には、いまプログラムがいる箇所はどこから呼び出されたのかという情報が記録されています。多重に関数のなかで呼び出されているような場合は配列の数が多くなります。
現在のプログラムの場所からプログラムがスタートした箇所までに、どんな経路を通ってそこに到達するに至ったかを詳しく読み取ることができます。呼び出された情報の連想配列のなかには、どのファイルの何行目でどんな引数を伴って呼び出されたのかなど、デバッグの役に立ついろんな情報が取れるのです。
Xdebugを使う
Xdebugを使えば、より簡単に開発中のデバッグができるようになります。Xdebugは、PHPの拡張モジュールで、PHPを動作させているサーバーにXdebugをインストールする必要があります。また、php.iniにXdebug用の設定を加える必要もあります。
サーバー
# pecl install xdebug
php.ini
zend_extension="[サーバーのパス]php/modules/xdebug.so"
Xdebugを使えば、var_dumpの結果表示がより見やすくなります。それぞれの値は、カラー表示になるのです。
また、多次元配列になっている部分は、インデントを下げて表示されます。
$arr = array('iPhone', 'Xperia', array('Nokia', 'Samsun'));
var_dump($arr);
まとめ
プログラマーにとって、上手にデバッグをするというスキルは、開発をより素早くこなせるようになるために必須の能力といえるでしょう。デバッグ力を確実に身につけて、エラーの少ない信頼してもらえる開発者となることができます。