[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クラスなどを作っておいて使い回すのもありです)。

ぜひご活用ください。