Dumpowanie zmiennych

Każdy debugujący zna funkcję var_dump, która wypisuje szczegółowe informacje o zmiennej. Niestety jej wyjście nie ma formatowania HTML i zlewa się w jedną linię, nie mówiąc o problemach z escapowaniem HTML. W praktyce trzeba zastąpić var_dump wygodniejszą funkcją. Tą funkcją jest dump().

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

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

generuje wyjście:

Domyślny jasny motyw możesz zmienić na ciemny:

Debugger::$dumpTheme = 'dark';

Możesz też zmienić głębokość zagnieżdżenia za pomocą Debugger::$maxDepth, długość wyświetlanych ciągów za pomocą Debugger::$maxLength i liczbę wyświetlanych pozycji tablicy albo obiektu za pomocą Debugger::$maxItems. Naturalnie niższe wartości przyspieszają renderowanie.

Debugger::$maxDepth = 2; // domyślnie: 15
Debugger::$maxLength = 50; // domyślnie: 150
Debugger::$maxItems = 50; // domyślnie: 100

Funkcja dump() potrafi też wyświetlić miejsce, z którego została wywołana, a dla obiektów ścieżkę do pliku, w którym zdefiniowana jest ich klasa. Steruje tym właściwość Debugger::$showLocation:

Debugger::$showLocation = true; // wyświetla informację o miejscu
Debugger::$showLocation = false; // ukrywa ją

Dla precyzyjniejszej kontroli wywołaj bezpośrednio Tracy\Dumper::dump() i przekaż opcję Dumper::LOCATION ustawioną na Dumper::LOCATION_CLASS (tylko miejsca definicji klas) albo Dumper::LOCATION_SOURCE (także miejsce wywołania dump()).

Praktycznymi alternatywami dla dump()dumpe() (dump & exit) i bdump(). Ta ostatnia pozwala nam dumpować wartości zmiennych w panelu Tracy Bara. Jest to bardzo wygodne, bo dumpy są oddzielone od layoutu strony, a poza tym możemy dodać im tytuł.

bdump([2, 4, 6, 8], 'liczby parzyste do dziesięciu');
bdump([1, 3, 5, 7, 9], 'liczby nieparzyste do dziesięciu');

Bezpośrednie użycie Tracy\Dumper

Za dump() stoi klasa Tracy\Dumper, której możesz też użyć bezpośrednio. W przeciwieństwie do dump() nie opiera się na Debuggerze i wszystkie ustawienia bierze z tablicy opcji, co czyni ją przydatną w samodzielnych skryptach, narzędziach CLI albo zawsze wtedy, gdy potrzebujesz dumpa jako ciągu. Ponieważ ustawienia pochodzą z tablicy, a nie z Debuggera, wartości domyślne nieco się różnią: głębokość to na przykład 7 zamiast 15.

Metody zwracają dump jako ciąg:

use Tracy\Dumper;

$html = Dumper::toHtml($var, [Dumper::DEPTH => 3]);  // HTML dla przeglądarki
$text = Dumper::toText($var);                         // zwykły tekst, np. do logu
$ansi = Dumper::toTerminal($var);                     // tekst z kolorami ANSI dla terminala

Albo wypisz zmienną od razu za pomocą Dumper::dump(), które automatycznie wybiera wyjście HTML albo terminalowe zgodnie ze środowiskiem:

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

Wyjście HTML potrzebuje małego arkusza stylów i skryptu. Gdy dumpujesz poza aplikacją z włączoną Tracy (czyli bez Debugger::enable()), wypisz je raz w nagłówku strony za pomocą Dumper::renderAssets(). Dumper::dump() robi to samo, ale toHtml() już nie.

Opcje

Wyjściem steruje tablica opcji przekazywana wszystkim powyższym metodom:

Opcja Opis Domyślnie
Dumper::DEPTH maksymalna głębokość zagnieżdżenia 7
Dumper::TRUNCATE maksymalna długość ciągów 150
Dumper::ITEMS maksymalna liczba wyświetlanych pozycji tablicy/obiektu 100
Dumper::COLLAPSE zwinąć węzeł najwyższego poziomu? true/false albo zwinąć go, gdy ma co najmniej tyle pozycji 14
Dumper::COLLAPSE_COUNT zwinąć węzeł zagnieżdżony, gdy ma co najmniej tyle pozycji 7
Dumper::LOCATION pokazać miejsce; true/false albo Dumper::LOCATION_CLASS (tylko miejsca definicji klas) czy Dumper::LOCATION_SOURCE (także miejsce wywołania) wyłączone
Dumper::THEME motyw kolorystyczny, light albo dark light
Dumper::HASH pokazać ID obiektów (znacznik #) i referencje (znacznik &)? true
Dumper::DEBUGINFO użyć magicznej metody obiektu __debugInfo()? false
Dumper::KEYS_TO_HIDE tablica nazw kluczy, których wartości są ukrywane jako ***** []
Dumper::SCRUBBER callback fn(string $key, mixed $value, ?string $class): bool zwracający true dla wartości wrażliwych brak
Dumper::OBJECT_EXPORTERS własne renderowanie obiektów, patrz niżej []

Opcje COLLAPSE, COLLAPSE_COUNT i THEME dotyczą tylko interaktywnego wyjścia HTML.

Opcja SCRUBBER ukrywa w dumpie wartości wrażliwe; kompletny przykład znajdziesz w Własny scrubber.

Na przykład żeby uzyskać zwięzły dump bez hashy obiektów:

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

Kolory ANSI używane przez toTerminal() można dostosować przez Dumper::$terminalColors.

Własne renderowanie obiektów

Domyślnie dumper renderuje obiekt, wypisując jego właściwości. Czasem nie jest to najbardziej pomocny widok: PhpToken na przykład pokazuje swój typ jako numeryczne ID zamiast czytelnej nazwy. Możesz nauczyć dumper, jak renderować konkretną klasę, rejestrując eksporter w Dumper::$objectExporters:

use Tracy\Dumper;

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

Eksporter otrzymuje obiekt i obiekt Tracy\Dumper\Value opisujący, jak zostanie wyświetlony. Przypisanie do $value->value zastępuje nagłówek (domyślnie nazwę klasy) Twoim własnym tekstem, więc zamiast listy właściwości dostajesz zwięzłą, czytelną etykietę. Ustawienie dotyczy każdego dumpa tej klasy, także obiektów zagnieżdżonych w tablicach albo innych obiektach. Alternatywnie możesz przekazać eksportery tylko dla jednego wywołania przez opcję Dumper::OBJECT_EXPORTERS metody Tracy\Dumper::dump().