もうエラーでつまずかない!PHP言語でデバッグを行う方法【初心者向け】現役エンジニアが解説
プログラミング初心者向けにPHP言語でデバッグを行う方法について解説しています。初めてサーバーサイド言語を扱うとなかなかエラーの場所を探すことが難しいと感じることも多いでしょう。エラーでつまずかないためにもぜひ書き方を覚えておきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
PHPのデバッグを行う方法について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
PHPのデバッグができると、エラーを未然に防ぎ、効率的に開発を進めることができるようになります。
PHPを始めたばかりという人は、エラーでつまずきやすいので、ぜひ理解しておきましょう。
PHPのデバッグは日々の業務で利用しますので、転職する際の面接で聞かれても答えることができるようにしておきましょう。
目次
そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。
PHPプログラムのデバッグとは?
デバッグとは、作成したPHPプログラムのエラーを訂正したり、プログラムが想定通りに動くかどうかのチェックなどをすることです。
プログラムの構文に間違いがあればエラーが表示されますが、それもデバッグの一種です。
カッコを閉じ忘れた、などは構文エラー(シンタックスエラー)となり、プログラムの動作が停止します。
田島メンター!デバッグとは何でしょうか?
ソースコードにエラーがないか、ちゃんと動くかどうか確かめることなんだ。
なるほど。でも、構文エラーだと、ちゃんとエラーを表示してくれますよね?さっき、中カッコ{}を書き忘れてたのでシンタックスエラーが出てました。
その通り。ただ、それ以外の場合、実際に値を入れて動作させてみないとわからないよね。
では、デバッグに便利な関数を見てみよう!
PHPのデバッグで覚えておきたい関数
PHP言語には、「print_r」「var_dump」「var_export」といったオブジェクトの値を表示する便利な関数があります。
多重構造になっている配列などで使用すると便利です。
各関数の説明
print_r
print_rは初心者にもわかりやすい表示形式です。
var_dump
print_rよりも詳細に、指定した式の型や値を含む構造化された情報を表示します。
例えば、配列の場合、構造の各値についても再帰的に表示します。
再帰的というのは、定義の中に更に定義が含まれている部分まで処理し続けることですが、今回のvar_dumpで言うと、とにかく詳細にデバッグしてくれるという意味で理解していただくと良いです。
var_export
var_dump同様に、構造化された情報表示可能です。
var_dumpと同じような感じですが、大きな違いとしては、表示結果の値が PHP コードであるということです。
サンプルコード
<?php
$a = [1,2,3];
echo('print_r'."n");
print_r($a);
echo('var_dump'."n");
var_dump($a);
echo('var_export'."n");
var_export($a);
解説
1行目の<?phpは、PHPプログラムを開始する宣言を意味します。
2行目の$a = [1,2,3];で、今回利用する配列を用意して変数$aに代入しています。
3行目のecho(‘print_r’.”n”);では、print_rという文字列を表示し、改行を出力してわかりやすい表示にしています。
これ以降も、echo●●という実装コードがありますがデバッグにおいて必須ということではなく、視認性向上を目的としています。
4行目のprint_r($a);では、print_rを利用してデバッグしています。
print_rの表示結果は次のとおりです。
Arrayというのが配列を意味します。
()で囲まれているのは、この範囲に配列の値を表示しているという意味です。
[0]というように[]で囲まれた数値は、配列の何番目の値かを意味します。
配列というのは最初の値が0番目から開始する点に注意が必要です。
=>では、[0]で示された0番目の配列に何が入っているかという意味です。
1が実際に0番目の配列に入っている値です。
つまり、このデバッグ結果では、「変数$aは配列で、0番目に1、1番目に2、2番目に3という値がある」ということを意味しています。
print_r
Array
(
[0] => 1
[1] => 2
[2] => 3
)
5行目のecho(‘var_dump’.”n”);では、var_dumpという文字列を表示し、改行を出力してわかりやすい表示にしています。
6行目のvar_dump($a);では、var_dumpを利用してデバッグしています。
表示結果は次のとおりです。
print_rの時とほぼ同じ表示結果ですが、若干内容が増えています。
array(3)の部分では、配列の構造が3であることを意味します。
()で囲まれているのは、この範囲に配列の値を表示しているという意味です。
[0]というように[]で囲まれた数値は、配列の何番目の値かを意味します。
=>では、[0]で示された0番目の配列に何が入っているかという意味です。
int(1)というのは、数値の1であることを意味します。
intは整数を意味する英語のintegerを省略表示です。
つまり、このデバッグ結果では、「変数$aは3つの構造からなる配列で、0番目に整数の1、1番目に整数の2、2番目に整数の3という値がある」ということを意味しています。
var_dump
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
7行目のecho(‘var_export’.”n”);では、var_exportという文字列を表示し、改行を出力してわかりやすい表示にしています。
8行目のvar_export($a);では、var_exportを利用してデバッグしています。
表示結果は次のとおりです。
これまでのデバッグ結果に比べシンプルに見えますが、これがPHPのコードです。
arrayの部分では、配列の構造であることを意味します。
()で囲まれているのは、この範囲に配列の値を表示しているという意味です。
0 => 1 では、配列の0番目に1があるということを意味します。
つまり、このデバッグ結果では、「変数$aは配列で、0番目に1、1番目に2、2番目に3という値がある」ということを意味しています。
var_export
array (
0 => 1,
1 => 2,
2 => 3,
)
表示結果
debug_backtrace関数
backtraceの情報をデバッグ表示します。
バックトレースというのは、これまでの処理が(back)どのような経路であるかを過程を追って調べる(trace)という意味です。
関数やオブジェクトが外部ファイルになっていたり、それが多重構造的に使用されている場合などに重宝します。
次のような内容が表示されます。
file・・・実行されたファイル
line・・・行番号
function・・・関数名
args・・・引数
debug_backtrace関数のサンプルコード
<?php
function a($a){
$a = $a + 1;
b($a);
}
function b($b){
$b = $b + 1;
c($b);
}
function c($c){
echo $c;
echo "<pre>";
print_r(debug_backtrace());
echo "</pre>";
}
a(1);
解説
表示結果の量が多いため一部を抜粋して説明します。
関数a()を実行すると関数b()が実行され、最後に関数cが実行されて表示されます。
実行すると、それぞれの関数についてトレースが表示されます。
[file] => /workspace/Main.phpでは、今回利用したファイルは、/workspace/Main.phpという意味です。
[line] => 8では、8行の処理を行ったという意味です。
[function] => cでは、関数cを利用したという意味です。
[args] => Array ([0] => 3)では、最後に配列の構造が表示されています。
[file] => /workspace/Main.php
[line] => 8
[function] => c
[args] => Array
(
[0] => 3
)
表示結果
3Array
(
[0] => Array
(
[file] => /workspace/Main.php
[line] => 8
[function] => c
[args] => Array
(
[0] => 3
)
)
[1] => Array
(
[file] => /workspace/Main.php
[line] => 4
[function] => b
[args] => Array
(
[0] => 3
)
)
[2] => Array
(
[file] => /workspace/Main.php
[line] => 16
[function] => a
[args] => Array
(
[0] => 2
)
)
)
「print_r」「var_dump」「var_export」は、変数や配列、オブジェクトの中身を展開してくれるんですねー。便利ですね。
そうそう。何が入っていたんだっけ?という時に便利だね。
debug_backtraceは、ちょっと難しいですねー。
ファイルを複数使っていたり、多重構造的になっている時に使うって覚えればいいかな。
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
PHPの実用的なデバッグ関数
PHPの組み込み関数を少し工夫して使用します。
function die_r($expression ,$return=false){
print_r($expression,$return);
exit;
}
使用するたびにプログラムが停止しますので、確認がしやすくなっています。
exitは、それ以降のプログラムの動作を停止します。
print_rの第2引数をtrueにすると、表示されずに変数などに代入できます。
他に覚えておきたい関数として、定数やインクルードされたファイルを表示するコードがあります。
get_included_files
include,requireされたすべてのPHPファイル名を返します。
どういう順番でファイルが読み込まれていったのか、ライブラリ、外部ファイルなどがロードされているかといったことを確認できます。
get_defined_constants
定義されているすべての定数を取得できます。
PHPのデフォルト定数も含まれるので膨大な量になってしまいますが、PHP5からは引数を与えると定数をカテゴリ分けしてくれるようになったので、見やすくなりました。
PHPのデバッグツール
IDE(統合開発環境)やフレームワークなどのツールには独自のデバッグ機構が備わっています。
デバッグツールの利用には設定が必要なものもあります。
PHPのIDE(統合開発環境)におけるデバッグ
IDEにXdebugのプラグインなどを導入すると、var_dumpの出力結果が見やすくなったり、ステップ実行などが可能になります。
- VSCode + PHP Debug + XDebug
- eclipse + PDT
- phpstorm
- netbeans
- Sublime Text(テキストエディタ)
- Atom(テキストエディタ)
PHPのフレームワークにおけるデバッグ
次のPHPフレームワーク各種には、独自のデバッグ関数が用意されています。
- Laravel
- CakePHP
- Symfony
- Codeigniter
- Zend Framework
おわりに
PHPはサーバサイド言語と呼ばれ、Webサイトの裏側の仕組みを作るためにあります。
そのためエラーなども表示には出ないので、つまずいたらデバッグしながら作業を進める必要があります。
ぜひデバッグの仕方を覚えておきましょう。
関数を組み立てて、デバッグ関数を作ったり、読み込んだファイル名を返したり、定義されている定数を表示してくれる関数があるんですねー。
今は、そういうのもあるって覚えておくだけでいいよ。
PHPの開発ツールやフレームワークにもデバッグが用意されているんですか?
ある時点からある時点までを実行できる、step実行のような機能もあったりするので、ある程度できるようになったら使ってみるのもいいね。
PHPを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!