[php] デバッグ時に利用するver_dumpの独自クラスで常に改行した結果を出力できるようにする

目次
はじめに
phpでコードを書いていると、変数や配列の確認などで「var_dump」をよく利用します。
しかし、var_dumpで出力すると改行されていないため、とてもわかりにくいですよね
今回は、このvar_dumpを改行させて見やすくするための方法の備忘録です。
基本的には毎回<pre>
タグで囲む
みなさんがよく利用されている方法が、毎回<pre>
タグを利用して出力する方法だと思います。
通常の状態
var_dump($arr);
// 表示結果
array(1) { ["datas"]=> array(1) { ["data"]=> array(2) { [0]=> array(3) { ["id"]=> int(1) ["name"]=> string(5) "test1" ["date"]=> array(1) { [0]=> array(3) { ["year"]=> int(2004) ["month"]=> int(10) ["day"]=> int(30) } } } [1]=> array(3) { ["id"]=> int(2) ["name"]=> string(5) "test2" ["date"]=> array(1) { [0]=> array(3) { ["year"]=> int(2004) ["month"]=> int(11) ["day"]=> int(30) } } } } } }
<pre>
タグで囲む
echo '<pre>';
var_dump($arr);
echo '</pre>';
// 表示結果
array(1) {
["datas"]=>
array(1) {
["data"]=>
array(2) {
[0]=>
array(3) {
["id"]=>
int(1)
["name"]=>
string(5) "test1"
["date"]=>
array(1) {
[0]=>
array(3) {
["year"]=>
int(2004)
["month"]=>
int(10)
["day"]=>
int(30)
}
}
}
[1]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(5) "test2"
["date"]=>
array(1) {
[0]=>
array(3) {
["year"]=>
int(2004)
["month"]=>
int(11)
["day"]=>
int(30)
}
}
}
}
}
}
コードがそのまま表示されるため、改行やインデントが行われた状態で表示することができます。
ただ、毎回<pre>
を入力するのも面倒だと思います。
そこで、var_dumpの独自クラスを作ってみます。
独自クラスでは、ログとして出力するかどうかを選択したり、見やすく背景や文字色を変えたりできるようにします。
また、一応var_exportで出力できるものを用意し、状況に応じて利用できるようにしておこうと思います。
var_dumpの独自クラスの作成と使い方
ユーティリティクラスを作成し、var_dump関数を独自で作成して呼び出します。
ここで用意する機能は下記となります。
- var_dump/var_export/logファイルとして出力するかの選択
- 出力結果を改行して見やすくする(
<pre>
利用) - 背景の色を変更できるようにする
- 文字の色を変更できるようにする
- ファイルとして出力できるようにする(出力箇所はcurrent)
var_dumpとvar_exportの関数を分けてログ出力は共通関数で呼び出すようにしています。
util.php
namespace Lib;
class Util
{
/*
* var_dump改行版
*/
public static function d_dump($data, $output_flg=false, $background="#ffffff", $color="#000000")
{
self::dump_output($data, $output_flg);
echo "<pre style='background:$background; color:$color; padding:10px 20px;'>";
var_dump($data);
echo "</pre>";
}
/*
* var_export改行版
*/
public static function e_dump($data, $output_flg=false, $background="#ffffff", $color="#000000")
{
self::dump_output($data, $output_flg);
echo "<pre style='background:$background; color:$color; padding:10px 20px;'>" . var_export($data, true) . "</pre>";
}
/*
* ログ出力共通関数
*/
private static function dump_output($data, $output_flg)
{
if($output_flg)
{
//バッファへの出力開始
ob_start();
echo "[" . date('Y/m/d H:i:s') . "]", PHP_EOL;
var_dump($data);
//バッファの内容を変数に代入
$content = ob_get_contents();
// バッファの終了
ob_end_clean();
error_log($content,3,'./dump.txt');
}
}
}
使い方とその結果については下記の通りです。
index.php
require_once $_SERVER['DOCUMENT_ROOT'].'/lib/util.php';
// Jsonファイル読み込み
$url = "http://localhost/sample1/json/sample.json";
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// jsonデータを連想配列に変換
$arr = json_decode($json,true);
// var_dump改行版
\Lib\Util::d_dump($arr);
// var_dump改行版+ログ出力
\Lib\Util::d_dump($arr, true);
// var_dump改行版+ログ出力+背景グレー
\Lib\Util::d_dump($arr, true, '#eeeeee');
// var_dump改行版+ログ出力+背景黒+文字白
\Lib\Util::d_dump($arr, true, '#000000', '#ffffff');
// var_export改行版
\Lib\Util::e_dump($arr);
//////////////////////////////
// (var_dump)改行版の表示結果
//////////////////////////////
array(1) {
["datas"]=>
array(1) {
["data"]=>
array(2) {
[0]=>
array(3) {
["id"]=>
int(1)
["name"]=>
string(5) "test1"
["date"]=>
array(1) {
[0]=>
array(3) {
["year"]=>
int(2004)
["month"]=>
int(10)
["day"]=>
int(30)
}
}
}
[1]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(5) "test2"
["date"]=>
array(1) {
[0]=>
array(3) {
["year"]=>
int(2004)
["month"]=>
int(11)
["day"]=>
int(30)
}
}
}
}
}
}
//////////////////////////////
// (var_export)改行版の表示結果
//////////////////////////////
array (
'datas' =>
array (
'data' =>
array (
0 =>
array (
'id' => 1,
'name' => 'test1',
'date' =>
array (
0 =>
array (
'year' => 2004,
'month' => 10,
'day' => 30,
),
),
),
1 =>
array (
'id' => 2,
'name' => 'test2',
'date' =>
array (
0 =>
array (
'year' => 2004,
'month' => 11,
'day' => 30,
),
),
),
),
),
)
最後に
var_dumpは便利ですが、見やすさについては少し難がありますね。
デバッグは極力シンプルに出力したいので、独自で関数を作ると楽だと思います。(Utilityクラスなどを作っておいて使い回すのもありです)。
ぜひご活用ください。