CakePHP3系のデバッグ時に役立つ関数
今回は、デバッグに役立つ関数を5つ紹介したいと思います。
デバッグする際に用意したデータは、こちら。
$test = ['a'=>'1', 'b'=>'2', 'c'=>'3', 'd'=>['e'=>'5', 'f'=>'6']]; |
デバッグをする際は見やすさも大事だと思ったのでサンプルデータとして配列を用意しました。
紹介する関数は以下の5つです。
CakePHP3系の関数
- pr()
- debug()
- dd()
PHPの関数
- var_dump()
- var_export()
■ pr()
出力を
<pre> タグで周りを囲む機能を追加した print_r() のラッパー。
debugモードがoffの時は出力されない。
以下、
pr($test);を実行。
ブラウザの表示
Array
(
[a] => 1
[b] => 2
[c] => 3
[d] => Array
(
[e] => 5
[f] => 6
)
)
HTMLソース
<pre class="pr">Array ( [a] => 1 [b] => 2 [c] => 3 [d] => Array ( [e] => 5 [f] => 6 ) )</pre> |
ログへの出力
// 例 Log::info(pr($test));の実行結果 2018-02-23 11:54:42 Info: Array ( [a] => 1 [b] => 2 [c] => 3 [d] => Array ( [e] => 5 [f] => 6 ) ) |
基本的に思った通りの動きをしてくれる関数かなと思います。
改行しインデントをつけた状態で表示してくれるので見やすくなります。
■ debug()
デバッグ時に必要な実行ファイル名や行数を表示してくれる。
debugモードがoffの時は出力されない。
以下、
debug($test);を実行。
ブラウザの表示
/src/Controller/TestController.php (line 19)
[
'a' => '1',
'b' => '2',
'c' => '3',
'd' => [
'e' => '5',
'f' => '6'
]
]
HTMLソース
<div class="cake-debug-output"> <span><strong>/src/Controller/TestController.php</strong> (line <strong>19</strong>)</span> <pre class="cake-debug"> [ 'a' => '1', 'b' => '2', 'c' => '3', 'd' => [ 'e ' => '5', 'f ' => '6' ] ] </pre> </div> |
ログへの出力
// 例 Log::info(debug($test));の実行結果 2018-02-23 12:34:15 Info: Array ( [a] => 1 [b] => 2 [c] => 3 [d] => Array ( [e] => 5 [f] => 6 ) ) |
debug()の場合、どのファイルの何行目の出力であるかがわかるので、便利です。しかし、ログに出力する際は他の関数と大きな違いは見当たりませんでした。
■ dd()
debug()実行後にdie()を実行して、終了する関数。
debugモードがoffの時は出力されない。
以下、
dd($test);を実行。
ブラウザの表示
/src/Controller/TestController.php (line 23)
[
'a' => '1',
'b' => '2',
'c' => '3',
'd' => [
'e' => '5',
'f' => '6'
]
]
HTMLソース
<div class="cake-debug-output"> <span><strong>/src/Controller/TestController.php</strong> (line <strong>23</strong>)</span> <pre class="cake-debug"> [ 'a' => '1', 'b' => '2', 'c' => '3', 'd' => [ 'e' => '5', 'f' => '6' ] ] </pre> </div> |
ログへの出力
// 例 Log::info(dd($test));の実行結果 |
基本的にdebug()と変わらないですが画面に出力後プログラム自体を終了するので、ログに出力を行う前に終了してしまうので、注意が必要です。
■ var_dump()
以下、
var_dump($test);を実行。
ブラウザの表示
array(4) { [“a”]=> string(1) “1” [“b”]=> string(1) “2” [“c”]=> string(1) “3” [“d”]=> array(2) { [“e”]=> string(1) “5” [“f”]=> string(1) “6” } }
HTMLソース
array(4) { ["a"]=> string(1) "1" ["b"]=> string(1) "2" ["c"]=> string(1) "3" ["d"]=> array(2) { ["e"]=> string(1) "5" ["f"]=> string(1) "6" } } |
ログへの出力
// 例 Log::info(var_dump($test));の実行結果 2018-02-23 12:23:33 Info: |
変数の型まで出力されるので、ブラウザを見ながらデバッグする際は便利です。
しかしログでは中身が出力されないので、注意が必要です。
■ var_export()
以下、
var_export($test);を実行。
ブラウザの表示
array(4) { [“a”]=> string(1) “1” [“b”]=> string(1) “2” [“c”]=> string(1) “3” [“d”]=> array(2) { [“e”]=> string(1) “5” [“f”]=> string(1) “6” } } array ( ‘a’ => ‘1’, ‘b’ => ‘2’, ‘c’ => ‘3’, ‘d’ => array ( ‘e’ => ‘5’, ‘f’ => ‘6’, ), )
HTMLソース
array(4) { ["a"]=> string(1) "1" ["b"]=> string(1) "2" ["c"]=> string(1) "3" ["d"]=> array(2) { ["e"]=> string(1) "5" ["f"]=> string(1) "6" } } |
ログへの出力
// 例 Log::info(var_export($test));の実行結果 2018-02-23 12:31:09 Info: |
第二引数に「true」を渡すと、ブラウザには出力されなくて、ログには出力されます。
以下、
var_export($test, true);を実行。
ブラウザの表示(何も表示されません。)
HTMLソース(もちろん何も表示されません。)
ログへの出力
// 例 Log::info(var_export($test, true));の実行結果 2018-02-23 12:32:23 Info: array ( 'a' => '1', 'b' => '2', 'c' => '3', 'd' => array ( 'e' => '5', 'f' => '6', ), ) |
var_export()の場合、用途によって引数を指定し実行する必要があります。
まとめ
ブラウザを見ながらデバッグを行う際に役立つ関数
- シンプルに変数内の構造を見たい場合、pr()
- 変数の型を見たければ、var_dump()、var_export()
- 実行された行を確認したければ、debug()
- 実行された行を確認したい、なおかつその行でプログラムを終了させたければ、dd()
ログファイルを見ながらデバッグを行う際に役立つ関数
- ログファイルを見ながらデバッグできる関数はブラウザをどの関数も特に違いは見当たらなかったです。
pr()
var_export()(ただし第二引数にtrueを指定する必要あり)
debug()
debugモードのみで表示される関数
- CakePHP3系独自の関数は、ブラウザにはdebugモードがonの時のみ表示されるようでした。ちなみに、ログに出す時はdebugモードがon/offに関わらず出力されているようでした。
pr()
debug()
おまけ REPLについて
CakePHPもREPL(インターラクティブコンソール)が装備されています。
(REPLはリプルと読むらしいです。)
以下のコマンドを実行することで、起動可能。
bin/cake console |
仕様を確認したい場合などに使ってみてください。
この記事を書いた人
- 新米エンジニアです。
最近書いた記事
- 2019.12.04Data Gateway Talk vol.4をレコチョクで開催しました。
- 2019.10.24そのグラフ、インターラクティブにしたくない?
- 2019.10.16発話プロトコル法を用いたユーザテストとデータ分析
- 2019.04.17第二弾 その平均値、危険ですよ! ~直感に反する平均値~