PHPでデバッグ。さてどうする・・・?
こんにちは。
開発チームのワイルド担当、萬代です。
開発を進めるにあたって、必ずついて回るのがデバッグ。今回は、デバッグする際の強力な味方、var_exportについて解説してみたいと思います。
デバッグする時、どうやってますか?
基本中の基本はvar_dumpだと思います。これを知らない人は、恐らくPHPを書いたことがない人でしょう。
でも、var_dumpはログに出力できません(単体では、という事。できなくはないけれど、デバッグという用途を考えるとお手軽感がまるでない)。
これがvar_dump最大の悩みどころだと思います。
じゃあ、print_rなのか?
print_rの前後でpreタグをechoするとか、あるある過ぎてもはやギャグですね。たまにやります(やるのか?)が。
serialize? それをDBに突っ込みますか。PHP前提ならそれでもいい・・・訳ないですよね。serializeでデバッグするなんて、茨の道にしか見えないけれど、いるんですよね、たまに。
もろに表示させたい時は、var_dumpでいいんですが、ログに書き落とすなどの用途に使う場合は、var_exportを私は推したい。
もしかすると、今更声高に言うほどではないのかも知れない。
var_exportってなんぞ?
var_exportという関数は、その名の通り、変数を外出しする時に使うものです。
その証左に、出力される情報は、まんまPHPの変数宣言となっています。
<?php $hoge = array( 'a', 'b', 'c', 'd', ); var_export($hoge);
この出力は、以下のようになります。
array ( 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', )
ちなみに、var_dumpとprint_rのフォーマットは以下の通りです。
// var_dump array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } // print_r Array ( [0] => a [1] => b [2] => c [3] => d )
ちなみに、PHP: var_export - Manual のサンプルソースに
var_exportしたデータを、evalを使って再度変数として定義するやり方が載っていますが、使途は不明ですが、要はそういう事です。
var_exportの真の実力
var_exportは、弊社が得意としているAPI開発において、その実力を遺憾なく発揮します。
API開発では、受け取ったリクエストを処理してJSON形式にして出力する事が多いですが、var_dumpすると、var_dumpした情報付きのJSONデータをレスポンスとして返してしまうので、クライアント側でJSONをパースする際に確実にエラーになります。
その際、ログファイルをtailして動作の確認をする事が多いと思いますが、前述の通り、ログファイルにvar_dumpの情報を書き落とすには、少しコツが必要です。
var_exportなら、第二引数にtrueを添えるだけで、出力を変数に格納できるので、ログファイルへの出力は非常に簡単です。
fuelphpなら、以下のようにログファイルへ出力できます。
$hoge = array( 'a', 'b', 'c', 'd', ); Log::debug(var_export($hoge, true));
可変引数のvar_dumpには到底出来ない芸当ですね。
var_dumpは配列内のデータ個数も出力してくれて便利じゃん
慣れろ、としか言いようがありません。
以上です。