Dumpování

Každý ladič je dobrým kamarádem s funkcí var_dump, která podrobně vypíše obsah proměnné. Bohužel v prostředí HTML výpis pozbude formátování a slije se do jednoho řádku, o sanitizaci HTML kódu ani nemluvě. V praxi je nezbytné var_dump nahradit šikovnější funkcí. Tou je právě dump().

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

dump($arr);
// nebo Debugger::dump($arr);

vygeneruje výstup:

Vychozí světlý motiv můžete změnit na tmavý:

Debugger::$dumpTheme = 'dark';

Dále můžeme změnit hloubku zanoření pomocí Debugger::$maxDepth, délku zobrazovaných řetězců pomocí Debugger::$maxLength a počet zobrazených položek pole či objektu pomocí Debugger::$maxItems. Nižší hodnoty laděnku přirozeně zrychlí.

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

Funkce dump() umí vypsat i místo, kde byla zavolána, a u objektů cestu k souboru, ve kterém je definována jejich třída. Řídí se to vlastností Debugger::$showLocation:

Debugger::$showLocation = true; // zobrazí informace o umístění
Debugger::$showLocation = false; // skryje je

Pro jemnější řízení volejte přímo Tracy\Dumper::dump() a předejte option Dumper::LOCATION s hodnotou Dumper::LOCATION_CLASS (jen kde jsou definovány třídy) nebo Dumper::LOCATION_SOURCE (navíc kde byla dump() zavolána).

Praktickou alternativou k dump() je dumpe() (dump & exit) a bdump(). Ten nám umožňuje vypsat hodnotu proměnné v panelu Tracy Baru. To je velmi šikovné, jelikož jsou dumpy oddělené od rozložení stránky a také k nim můžeme umístit komentář.

bdump([2, 4, 6, 8], 'sudá čísla do deseti');
bdump([1, 3, 5, 7, 9], 'lichá čísla do deseti');

Přímé použití Tracy\Dumper

Za funkcí dump() stojí třída Tracy\Dumper, kterou můžete používat i přímo. Na rozdíl od dump() nezávisí na Debuggeru a veškeré nastavení přebírá z pole voleb, což se hodí pro samostatné skripty, CLI nástroje nebo kdykoli potřebujete dump jako řetězec. Protože nastavení pochází z pole a ne z Debuggeru, výchozí hodnoty se mírně liší: hloubka je například 7 místo 15.

Metody vrací dump jako řetězec:

use Tracy\Dumper;

$html = Dumper::toHtml($var, [Dumper::DEPTH => 3]);  // HTML pro prohlížeč
$text = Dumper::toText($var);                         // prostý text, např. do logu
$ansi = Dumper::toTerminal($var);                     // text s ANSI barvami pro terminál

Nebo proměnnou rovnou vypište pomocí Dumper::dump(), která podle prostředí automaticky zvolí HTML nebo terminálový výstup:

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

HTML výstup potřebuje drobný styl a skript. Když dumpujete mimo aplikaci se zapnutou Tracy (tj. bez Debugger::enable()), vypište je jednou v hlavičce stránky pomocí Dumper::renderAssets(). Dumper::dump() to udělá sama, toHtml() nikoli.

Volby

Výstup řídí pole voleb předané všem výše uvedeným metodám:

Volba Popis Výchozí
Dumper::DEPTH maximální hloubka zanoření 7
Dumper::TRUNCATE maximální délka řetězců 150
Dumper::ITEMS maximální počet zobrazených položek pole/objektu 100
Dumper::COLLAPSE sbalit kořenový uzel? true/false, nebo sbalit, jakmile má aspoň tolik položek 14
Dumper::COLLAPSE_COUNT sbalit zanořený uzel, jakmile má aspoň tolik položek 7
Dumper::LOCATION zobrazit místo; true/false, nebo Dumper::LOCATION_CLASS (jen kde jsou definovány třídy) či Dumper::LOCATION_SOURCE (navíc místo volání) vypnuto
Dumper::THEME barevné téma, light nebo dark light
Dumper::HASH zobrazit ID objektů (značka #) a reference (značka &)? true
Dumper::DEBUGINFO použít magickou metodu objektu __debugInfo()? false
Dumper::KEYS_TO_HIDE pole názvů klíčů, jejichž hodnoty se skryjí jako ***** []
Dumper::SCRUBBER callback fn(string $key, mixed $value, ?string $class): bool vracející true pro citlivé hodnoty žádný
Dumper::OBJECT_EXPORTERS vlastní vykreslení objektů, viz níže []

Volby COLLAPSE, COLLAPSE_COUNT a THEME se týkají jen interaktivního HTML výstupu.

Volba SCRUBBER skryje z výpisu citlivé hodnoty; kompletní příklad viz Vlastní scrubber.

Například kompaktní výpis bez hashů objektů získáte takto:

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

ANSI barvy použité metodou toTerminal() lze upravit přes Dumper::$terminalColors.

Vlastní vykreslení objektů

Ve výchozím stavu dumper vykreslí objekt výpisem jeho properties. Někdy to ale není nejužitečnější pohled – třeba PhpToken zobrazí svůj typ jako číselné ID místo čitelného názvu. Dumperu můžete říct, jak má konkrétní třídu vykreslit, zaregistrováním exportéru do Dumper::$objectExporters:

use Tracy\Dumper;

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

Exportér dostane objekt a objekt Tracy\Dumper\Value popisující, jak se objekt zobrazí. Přiřazení do $value->value nahradí hlavičku (ve výchozím stavu název třídy) vaším vlastním textem, takže místo výpisu properties dostanete kompaktní, čitelný popisek. Nastavení se uplatní na každý dump dané třídy, i na objekty zanořené v polích či jiných objektech. Případně můžete exportéry předat jen pro jedno volání pomocí option Dumper::OBJECT_EXPORTERS funkce Tracy\Dumper::dump().