Dump delle variabili

Ogni debugger conosce la funzione var_dump, che stampa informazioni dettagliate su una variabile. Purtroppo il suo output non ha formattazione HTML e si fonde in un'unica riga, per non parlare dei problemi con l'escaping HTML. Nella pratica è quindi necessario sostituire var_dump con una funzione più comoda. E quella funzione è dump().

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

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

produce questo output:

Il tema chiaro predefinito lo potete cambiare in scuro:

Debugger::$dumpTheme = 'dark';

Potete anche cambiare la profondità di annidamento con Debugger::$maxDepth, la lunghezza delle stringhe mostrate con Debugger::$maxLength e il numero di elementi di array o oggetti mostrati con Debugger::$maxItems. Naturalmente valori più bassi accelerano il rendering.

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

La funzione dump() sa mostrare anche il punto da cui è stata chiamata e, per gli oggetti, il percorso del file in cui è definita la loro classe. Lo governa la proprietà Debugger::$showLocation:

Debugger::$showLocation = true; // mostra l'informazione sul punto
Debugger::$showLocation = false; // la nasconde

Per un controllo più fine chiamate direttamente Tracy\Dumper::dump() e passate l'opzione Dumper::LOCATION impostata a Dumper::LOCATION_CLASS (solo dove sono definite le classi) oppure Dumper::LOCATION_SOURCE (anche dove è stato chiamato dump()).

Alternative pratiche a dump() sono dumpe() (dump & exit) e bdump(). Quest'ultima ci permette di fare il dump dei valori delle variabili nel pannello della Tracy Bar. Il che è molto comodo, perché i dump restano separati dal layout della pagina e possiamo per di più dare loro un titolo.

bdump([2, 4, 6, 8], 'numeri pari fino a dieci');
bdump([1, 3, 5, 7, 9], 'numeri dispari fino a dieci');

Usare direttamente Tracy\Dumper

Dietro dump() sta la classe Tracy\Dumper, che potete usare anche direttamente. A differenza di dump() non dipende da Debugger e prende tutte le sue impostazioni da un array di opzioni, il che la rende comoda per script autonomi, strumenti CLI o ogni volta che vi serve il dump come stringa. Poiché le impostazioni vengono dall'array e non da Debugger, i valori predefiniti differiscono leggermente: la profondità è per esempio 7 invece di 15.

I metodi restituiscono il dump come stringa:

use Tracy\Dumper;

$html = Dumper::toHtml($var, [Dumper::DEPTH => 3]);  // HTML per il browser
$text = Dumper::toText($var);                         // testo semplice, per esempio per un log
$ansi = Dumper::toTerminal($var);                     // testo con colori ANSI per il terminale

Oppure stampate la variabile subito con Dumper::dump(), che sceglie automaticamente l'output HTML o da terminale secondo l'ambiente:

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

L'output HTML ha bisogno di un piccolo foglio di stile e di uno script. Quando fate il dump fuori da un'applicazione con Tracy attiva (cioè senza Debugger::enable()), stampateli una volta nell'head della pagina con Dumper::renderAssets(). Dumper::dump() lo fa da sé, toHtml() no.

Opzioni

L'output è governato dall'array di opzioni passato a tutti i metodi sopra:

Opzione Descrizione Predefinito
Dumper::DEPTH profondità massima di annidamento 7
Dumper::TRUNCATE lunghezza massima delle stringhe 150
Dumper::ITEMS numero massimo di elementi mostrati in un array/oggetto 100
Dumper::COLLAPSE comprimere il nodo principale? true/false, oppure comprimerlo quando ha almeno questo numero di elementi 14
Dumper::COLLAPSE_COUNT comprimere un nodo annidato quando ha almeno questo numero di elementi 7
Dumper::LOCATION mostrare il punto; true/false, oppure Dumper::LOCATION_CLASS (solo dove sono definite le classi) o Dumper::LOCATION_SOURCE (anche il punto della chiamata) disattivo
Dumper::THEME tema di colori, light oppure dark light
Dumper::HASH mostrare gli ID degli oggetti (il marcatore #) e i riferimenti (il marcatore &)? true
Dumper::DEBUGINFO usare il metodo magico __debugInfo() dell'oggetto? false
Dumper::KEYS_TO_HIDE array di nomi di chiavi i cui valori vengono nascosti come ***** []
Dumper::SCRUBBER callback fn(string $key, mixed $value, ?string $class): bool che restituisce true per i valori sensibili nessuno
Dumper::OBJECT_EXPORTERS rendering personalizzato degli oggetti, vedi sotto []

Le opzioni COLLAPSE, COLLAPSE_COUNT e THEME valgono solo per l'output HTML interattivo.

L'opzione SCRUBBER nasconde dal dump i valori sensibili; un esempio completo lo trovate in Scrubber personalizzato.

Per ottenere per esempio un dump compatto senza gli hash degli oggetti:

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

I colori ANSI usati da toTerminal() si possono personalizzare con Dumper::$terminalColors.

Rendering personalizzato degli oggetti

Per impostazione predefinita il dumper renderizza un oggetto elencandone le proprietà. A volte però non è la vista più utile: un PhpToken, per esempio, mostra il proprio tipo come ID numerico invece che come nome leggibile. Potete insegnare al dumper come renderizzare una determinata classe registrando un exporter in Dumper::$objectExporters:

use Tracy\Dumper;

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

L'exporter riceve l'oggetto e un oggetto Tracy\Dumper\Value che descrive come verrà mostrato. Assegnare a $value->value sostituisce l'intestazione (per impostazione predefinita il nome della classe) con un vostro testo, così invece di un elenco di proprietà ottenete un'etichetta compatta e leggibile. L'impostazione vale per ogni dump di quella classe, anche per gli oggetti annidati dentro array o altri oggetti. In alternativa potete passare gli exporter per una sola chiamata con l'opzione Dumper::OBJECT_EXPORTERS di Tracy\Dumper::dump().