変数のダンプ

デバッグをする人なら誰でも var_dump関数をご存じでしょう。変数の詳しい情報を出力してくれます。ただ残念なことに、その出力は HTML の整形がなく 1 行にまとまってしまいますし、HTML のエスケープの問題もあります。実務では var_dump をもっと便利な関数に置き換えたくなります。それが dump() です。

$arr = [10, 20.2, true, null, 'hello'];

dump($arr);
// または Debugger::dump($arr);

これは次の出力を生みます。

既定の明るいテーマは暗いテーマに変えられます。

Debugger::$dumpTheme = 'dark';

入れ子の深さは Debugger::$maxDepthで、表示される文字列の長さは Debugger::$maxLengthで、配列やオブジェクトの表示される要素の数は Debugger::$maxItemsで変えられます。当然ながら、小さい値にすると描画が速くなります。

Debugger::$maxDepth = 2; // 既定: 15
Debugger::$maxLength = 50; // 既定: 150
Debugger::$maxItems = 50; // 既定: 100

dump() 関数は、それが呼ばれた場所や、オブジェクトならそのクラスが定義されているファイルへのパスも表示できます。これは Debugger::$showLocationプロパティが決めます。

Debugger::$showLocation = true; // 場所の情報を表示します
Debugger::$showLocation = false; // 隠します

より細かく決めたいなら、Tracy\Dumper::dump() を直接呼び、Dumper::LOCATION オプションに Dumper::LOCATION_CLASS(クラスが定義されている場所だけ)か Dumper::LOCATION_SOURCEdump() が呼ばれた場所も)を渡します。

dump() の実用的な仲間が dumpe()(dump & exit)と bdump() です。後者は変数の値を Tracy Bar のパネルにダンプできます。ダンプがページの見た目から離れるうえ、見出しも付けられるので、とても便利です。

bdump([2, 4, 6, 8], 'even numbers up to ten');
bdump([1, 3, 5, 7, 9], 'odd numbers up to ten');

Tracy\Dumper を直接使う

dump() の裏には Tracy\Dumper クラスがあり、これを直接使うこともできます。dump() と違って Debugger に頼らず、設定はすべてオプションの配列から取るので、単独のスクリプトや CLI の道具、あるいはダンプを文字列として欲しいときに便利です。設定が Debugger ではなく配列から来るので、既定値は少し違います。たとえば深さは 15 ではなく 7 です。

これらのメソッドはダンプを文字列として返します。

use Tracy\Dumper;

$html = Dumper::toHtml($var, [Dumper::DEPTH => 3]);  // ブラウザ向けの HTML
$text = Dumper::toText($var);                         // 平文。たとえばログ向け
$ansi = Dumper::toTerminal($var);                     // 端末向けの ANSI の色付きテキスト

あるいは Dumper::dump() で変数をそのまま出力します。これは環境に応じて HTML か端末向けの出力かを自動的に選びます。

Dumper::dump($var, [Dumper::DEPTH => 3]);

HTML の出力には小さなスタイルシートとスクリプトが要ります。Tracy が有効なアプリケーションの外で(つまり Debugger::enable() なしで)ダンプするときは、Dumper::renderAssets() でページの head に一度だけ出力してください。Dumper::dump() はこれを自分で行いますが、toHtml() は行いません。

オプション

出力は、上のすべてのメソッドに渡すオプションの配列が決めます。

オプション 説明 既定
Dumper::DEPTH 入れ子の深さの上限 7
Dumper::TRUNCATE 文字列の長さの上限 150
Dumper::ITEMS 配列やオブジェクトで表示される要素の数の上限 100
Dumper::COLLAPSE 最上位のノードを畳みますか。true/false、または要素がこの数以上になったら畳む 14
Dumper::COLLAPSE_COUNT 入れ子のノードを、要素がこの数以上になったら畳む 7
Dumper::LOCATION 場所を表示します。true/false、または Dumper::LOCATION_CLASS(クラスが定義されている場所だけ)か Dumper::LOCATION_SOURCE(呼び出しの場所も) オフ
Dumper::THEME 色のテーマ。lightdark light
Dumper::HASH オブジェクトの ID(# の印)と参照(& の印)を表示しますか true
Dumper::DEBUGINFO オブジェクトのマジックメソッド __debugInfo() を使いますか false
Dumper::KEYS_TO_HIDE 値を ***** として隠すキーの名前の配列 []
Dumper::SCRUBBER 機微な値に対して true を返すコールバック fn(string $key, mixed $value, ?string $class): bool なし
Dumper::OBJECT_EXPORTERS オブジェクトの独自の描画。下をご覧ください []

COLLAPSECOLLAPSE_COUNTTHEME のオプションは、対話的な HTML の出力にだけ当てはまります。

SCRUBBER オプションはダンプから機微な値を隠します。完全な例は 独自の Scrubberをご覧ください。

たとえばオブジェクトのハッシュのない、こぢんまりしたダンプを得るには次のようにします。

echo Dumper::toText($var, [Dumper::HASH => false]);

toTerminal() が使う ANSI の色は Dumper::$terminalColors で変えられます。

オブジェクトの独自の描画

既定では、ダンパーはオブジェクトをそのプロパティを並べる形で描きます。それがいちばん役に立つ見せ方とは限りません。たとえば PhpToken は、その種類を読める名前ではなく数の ID として見せます。Dumper::$objectExporters にエクスポーターを登録すれば、あるクラスをどう描くかをダンパーに教えられます。

use Tracy\Dumper;

Dumper::$objectExporters[PhpToken::class] = function (PhpToken $token, Dumper\Value $value): void {
	$value->value = $token->getTokenName() . ' ' . $token->text;
};

エクスポーターはオブジェクトと、それがどう見せられるかを表す Tracy\Dumper\Value オブジェクトを受け取ります。$value->value に代入すると、見出し(既定ではクラス名)があなたのテキストに置き換わるので、プロパティの一覧の代わりにこぢんまりした読みやすい表示になります。この設定は、そのクラスのすべてのダンプに、配列やほかのオブジェクトの中に入れ子になったものにも当てはまります。あるいは Tracy\Dumper::dump()Dumper::OBJECT_EXPORTERS オプションで、その呼び出しにだけエクスポーターを渡せます。