PHP
debug
ポエム

秘伝の var_dump 関数を公開します。

様々なプロジェクトを渡り歩き少しずつ改良しながら使ってきた秘伝の var_dump() ラッパー関数です。

function d()
{
    // 全引数の var_dump() の出力内容を変数に取り出し
    ob_start();
    foreach (func_get_args() as $arg) {
        var_dump($arg);
    }
    $dump = ob_get_clean();

    // 可読性のためインデント幅を2倍に (2 -> 4)
    $dump = preg_replace_callback(
        '/^\s++/m',
        function ($m) {
            return str_repeat(" ", strlen($m[0]) * 2);
        },
        $dump
    );

    // この関数の呼び出し元を取得 (ファイルパス・行番号)
    $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0];

    // ヘッダーの HTML を生成
    $header = sprintf('<pre style="%s">', implode(';', [
        'border: 1px solid #bbb',
        'margin: 2px',
        'padding: 6px',
        'solid: #bbb',
        'text-align: left',
        'background: #fdfdfd',
        'color: #000',
        'font-family: monospace,serif',
        'font-size: 12px',
    ]));
    $header .= sprintf('<span style="%s">%s:%d</span>',
        implode(';', ['font-weight: bold']),
        $caller['file'],
        $caller['line']
    );
    $header .= PHP_EOL;

    // フッターの HTML を生成
    $footer = '</pre>' . PHP_EOL;

    // ダンプ内容を出力 (CLI で実行された場合は HTML タグを取り除く)
    $isCli = (php_sapi_name() === 'cli');
    echo $isCli ? strip_tags($header) : $header;
    echo $dump;
    echo $isCli ? strip_tags($footer) : $footer;
}

ポイント

  • 関数名が一文字なので手軽です。
  • HTML + CSS で見やすく装飾されます。
    • コマンドラインから実行した場合は HTML は取り除かれ plain なテキストでダンプされます。
  • 可変長引数に対応しています。
    • 例: d($var1, $var2, $var3);
  • ダンプ元のファイルパスと行番号も出力されるので、どこに書いたか忘れちゃっても大丈夫です。
    • 出力フォーマットは ファイルパス:行番号 なので、そのままコピーして PhpStorm のファイルナビゲート欄 (Mac: ⇧⌘O / Win: Ctrl + Shift + N) とかに貼りつければダンプ元にジャンプできます。

なんだかんだ PHP で一番頼りになるデバッグ方法は愚直な変数ダンプだと思ってる。(個人の感想です。)

参考