はじめに
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クラスなどを作っておいて使い回すのもありです)。
ぜひご活用ください。