はじめに
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 '
'; var_dump($arr); echo '';
// 表示結果
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 "
"; var_dump($data); echo "";
}/*
* var_export改行版
*/
public static function e_dump($data, $output_flg=false, $background="#ffffff", $color="#000000")
{
self::dump_output($data, $output_flg);
echo "" . var_export($data, true) . "";
}/*
* ログ出力共通関数
*/
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クラスなどを作っておいて使い回すのもありです)。
ぜひご活用ください。