Değişkenleri Dökme
******************
Hata ayıklayan herkes, bir değişken hakkında ayrıntılı bilgi yazdıran [php: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.
```php
$arr = [10, 20.2, true, null, 'hello'];
dump($arr);
// ya da Debugger::dump($arr);
```
şu çıktıyı üretir:
[* dump-basic.webp *]
Varsayılan açık temayı koyuya çevirebilirsiniz:
```php
Debugger::$dumpTheme = 'dark';
```
[* dump-dark.webp *]
İç içe geçme derinliğini [Debugger::$maxDepth |api:Tracy\Debugger::$maxDepth] ile, gösterilen dizelerin uzunluğunu [Debugger::$maxLength |api:Tracy\Debugger::$maxLength] ile, gösterilen dizi ya da nesne öğelerinin sayısını ise [Debugger::$maxItems |api:Tracy\Debugger::$maxItems] ile de değiştirebilirsiniz. Doğal olarak düşük değerler render'ı hızlandırır.
```php
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 |api:Tracy\Debugger::$showLocation] özelliği denetler:
```php
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.
```php
bdump([2, 4, 6, 8], 'ona kadar çift sayılar');
bdump([1, 3, 5, 7, 9], 'ona kadar tek sayılar');
```
[* bardump-en.webp *]
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:
```php
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:
```php
Dumper::dump($var, [Dumper::DEPTH => 3]);
```
.[note]
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 |recipes#Özel Scrubber].
Örneğin nesne hash'leri olmadan derli toplu bir döküm almak için:
```php
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:
```php
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.
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.
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:
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?
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.