■デバッグとは
プログラムが意図した動きをしない、不具合が発生する場合に、
その原因(バグ)を探し、取り除く修正作業のことをデバッグといいます。
例えば以下のプログラムにはバグがあります。
※サンプルに配列を使用しています。配列についてはこちらの記事をご参照ください。
1 2 3 4 5 6 7 8 9 10 | <?php $nums = array (1, 2, 3, 'a' , true, false); $sum = 0; foreach ( $nums as $num ) { $sum += $num ; } echo '合計 : ' . $sum ; ?> |
今回はコードも短くミスが見つけやすいですが、実際の開発プロジェクトのコードはもっと量が多く、バグの箇所を見つけるのは大変です。
そんなときに役立つのがデバッグ関数です。
■デバッグに便利な関数
デバッグを行う上で、どこまでは正常に処理され、
どの場所で異常な処理が行われているかを探すために、変数の中身を確認しながら処理を追っていきます。
その際に使用する便利な関数がありますのでご紹介します。
print_r関数
print_r関数の後ろのカッコの中(引数)に変数を指定すると、その変数に格納された値を表示することができます。
echo や print とは異なり、配列の中身も表示することが可能です。
また、第二引数にtrueを指定した場合、関数の実行結果が文字列として扱われるため、print_rの結果をログファイルにそのまま書き出すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $nums = array (1, 2, 3, 'a' , true, false); print_r( $num ); $sum = 0; foreach ( $nums as $num ) { $sum += $num ; } echo '合計 : ' . $sum ; ?> |
var_dump関数
var_dump関数も引数に変数を指定すると、その中身を表示してくれます。
print_rと異なる点は、値のデータ型が表示される点です。
また、print_rでtrueやfalseのようなbool型の値を出力すると、1や空白として表示されてしまいましたが、
var_dumpの場合はtrue/falseとそのまま表示することができます。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $nums = array (1, 2, 3, 'a' , true, false); var_dump( $num ); $sum = 0; foreach ( $nums as $num ) { $sum += $num ; } echo '合計 : ' . $sum ; ?> |
var_export関数
var_export関数の場合は、データ型は表示されませんが、true/falseがそのまま表示されます。
また、print_rと同じで第二引数にtrueを指定すると文字列化できます。
細かい違いですが、配列のインデックスに[]がつかなくなります。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $nums = array (1, 2, 3, 'a' , true, false); var_export( $num ); $sum = 0; foreach ( $nums as $num ) { $sum += $num ; } echo '合計 : ' . $sum ; ?> |
■おまけ
実はデバッグ関数で表示する際、preタグでくくると改行されて見やすくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php $nums = array (1, 2, 3, 'a' , true, false); echo '<div>print_r関数</div>' ; echo '<pre>' ; print_r( $nums ); echo '</pre>' ; echo '<hr>' ; echo '<div>var_dump関数</div>' ; echo '<pre>' ; var_dump( $nums ); echo '</pre>' ; echo '<hr>' ; echo '<div>var_export関数</div>' ; echo '<pre>' ; var_export( $nums ); echo '</pre>' ; ?> |
■まとめ
デバッグ関数を3つご紹介しました!
特徴を表でまとめてみます。
データ型の表示 | bool型の表示 | 文字列化 | |
---|---|---|---|
print_r | ✕ | 1または空白 | ○ |
var_dump | ○ | trueまたはfalse | ✕ |
print_r | ✕ | trueまたはfalse | ○ |
個人的に一番使用するのはvar_dumpです。
デバッグの際、表示できるデータは全て表示した方がエラー原因を特定できる可能性が上がるからです。
ユーザーが見るものではなく、開発者が見るものですからね。
またフレームワークにデバッグ用の関数が用意されている場合もありますので、フレームワークを導入されている方はぜひ確認してみてください!