Değişkenleri Dökme

Hata ayıklayan herkes, bir değişken hakkında ayrıntılı bilgi yazdıran var_dump fonksiyonunu bilir. Ne yazık ki çıktısında HTML biçimlendirmesi yoktur ve tek satıra birleşir; HTML kaçışlama sorunlarından söz bile etmiyoruz. Pratikte var_dump fonksiyonunu daha elverişli bir fonksiyonla değiştirmek gerekir. O fonksiyon dump()'tır.

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

dump($arr);
// ya da Debugger::dump($arr);

şu çıktıyı üretir:

Varsayılan açık temayı koyuya çevirebilirsiniz:

Debugger::$dumpTheme = 'dark';

İç içe geçme derinliğini Debugger::$maxDepth ile, gösterilen dizelerin uzunluğunu Debugger::$maxLength ile, gösterilen dizi ya da nesne öğelerinin sayısını ise Debugger::$maxItems ile de değiştirebilirsiniz. Doğal olarak düşük değerler render'ı hızlandırır.

Debugger::$maxDepth = 2; // varsayılan: 15
Debugger::$maxLength = 50; // varsayılan: 150
Debugger::$maxItems = 50; // varsayılan: 100

dump() fonksiyonu, çağrıldığı yeri ve nesnelerde sınıflarının tanımlandığı dosyanın yolunu da gösterebilir. Bunu Debugger::$showLocation özelliği denetler:

Debugger::$showLocation = true; // konum bilgisini gösterir
Debugger::$showLocation = false; // gizler

Daha ince denetim için Tracy\Dumper::dump() metodunu doğrudan çağırın ve Dumper::LOCATION seçeneğine Dumper::LOCATION_CLASS (yalnızca sınıfların tanımlandığı yer) ya da Dumper::LOCATION_SOURCE (ayrıca dump() çağrısının yapıldığı yer) değerini verin.

dump() fonksiyonunun pratik alternatifleri dumpe() (dump & exit) ve bdump()'tır. İkincisi, değişken değerlerini Tracy Bar panelinde dökmemizi sağlar. Bu çok elverişlidir; çünkü dökümler sayfa yerleşiminden ayrıdır ve onlara başlık da ekleyebiliriz.

bdump([2, 4, 6, 8], 'ona kadar çift sayılar');
bdump([1, 3, 5, 7, 9], 'ona kadar tek sayılar');

Tracy\Dumper'ı Doğrudan Kullanma

dump() fonksiyonunun arkasında, doğrudan da kullanabileceğiniz Tracy\Dumper sınıfı vardır. dump() fonksiyonunun aksine Debugger sınıfına dayanmaz ve tüm ayarlarını bir seçenek dizisinden alır; bu da onu bağımsız betikler, CLI araçları ya da dökümü dize olarak istediğiniz her durum için kullanışlı kılar. Ayarlar Debugger yerine diziden geldiğinden varsayılanlar biraz farklıdır: örneğin derinlik 15 yerine 7'dir.

Metotlar dökümü dize olarak döndürür:

use Tracy\Dumper;

$html = Dumper::toHtml($var, [Dumper::DEPTH => 3]);  // tarayıcı için HTML
$text = Dumper::toText($var);                         // düz metin, örneğin günlük için
$ansi = Dumper::toTerminal($var);                     // terminal için ANSI renkli metin

Ya da değişkeni, ortama göre HTML mi terminal çıktısı mı vereceğini otomatik seçen Dumper::dump() ile doğrudan yazdırın:

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

HTML çıktısı küçük bir stil sayfası ve betik gerektirir. Tracy'nin etkin olduğu bir uygulamanın dışında (yani Debugger::enable() olmadan) döküm yaparken, bunları sayfa başlığında bir kez Dumper::renderAssets() ile yazdırın. Dumper::dump() bunu kendisi yapar, ama toHtml() yapmaz.

Seçenekler

Çıktıyı, yukarıdaki tüm metotlara aktarılan bir seçenek dizisi denetler:

Seçenek Açıklama Varsayılan
Dumper::DEPTH en fazla iç içe geçme derinliği 7
Dumper::TRUNCATE dizelerin en fazla uzunluğu 150
Dumper::ITEMS bir dizi/nesnede gösterilecek en fazla öğe sayısı 100
Dumper::COLLAPSE üst düğüm katlansın mı? true/false ya da en az bu kadar öğesi olunca katla 14
Dumper::COLLAPSE_COUNT iç içe bir düğüm en az bu kadar öğesi olunca katlansın 7
Dumper::LOCATION konumu göster; true/false ya da Dumper::LOCATION_CLASS (yalnızca sınıfların tanımlandığı yer) veya Dumper::LOCATION_SOURCE (ayrıca çağrı yeri) kapalı
Dumper::THEME renk teması, light ya da dark light
Dumper::HASH nesne ID'leri (# işareti) ve referanslar (& işareti) gösterilsin mi? true
Dumper::DEBUGINFO nesnenin sihirli __debugInfo() metodu kullanılsın mı? false
Dumper::KEYS_TO_HIDE değerleri ***** olarak gizlenecek anahtar adlarının dizisi []
Dumper::SCRUBBER hassas değerler için true döndüren fn(string $key, mixed $value, ?string $class): bool callback'i yok
Dumper::OBJECT_EXPORTERS nesnelerin özel render'ı, aşağıya bakın []

COLLAPSE, COLLAPSE_COUNT ve THEME seçenekleri yalnızca etkileşimli HTML çıktısında geçerlidir.

SCRUBBER seçeneği hassas değerleri dökümden gizler; tam bir örnek için bkz. Özel scrubber.

Örneğin nesne hash'leri olmadan derli toplu bir döküm almak için:

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

toTerminal() metodunun kullandığı ANSI renkleri Dumper::$terminalColors ile özelleştirilebilir.

Nesnelerin Özel Render'ı

Dumper, bir nesneyi varsayılan olarak özelliklerini listeleyerek render eder. Bazen bu en yararlı görünüm değildir; örneğin bir PhpToken, türünü okunabilir bir ad yerine sayısal bir ID olarak gösterir. Dumper::$objectExporters içine bir exporter kaydederek dumper'a belirli bir sınıfı nasıl render edeceğini öğretebilirsiniz:

use Tracy\Dumper;

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

Exporter, nesneyi ve onun nasıl gösterileceğini anlatan bir Tracy\Dumper\Value nesnesini alır. $value->value özelliğine atama yapmak, başlığı (varsayılan olarak sınıf adını) kendi metninizle değiştirir; böylece özellik listesi yerine derli toplu, okunabilir bir etiket elde edersiniz. Ayar, o sınıfın her dökümünde, hatta dizilerin ya da başka nesnelerin içine gömülü nesnelerde bile geçerlidir. Alternatif olarak, exporter'ları yalnızca tek bir çağrı için Tracy\Dumper::dump() metodunun Dumper::OBJECT_EXPORTERS seçeneğiyle aktarabilirsiniz.