CodeBlanks Logo Icon CodeBlanks

Özet - Generator'lar

PHP kursu · Uzman · Ders 7/54

yield, yield from ve pipeline'la büyük log dosyası ayrıştırıcı yazarsın.

Özet - Generator'lar

Bu grupta yield ile değer üreten fonksiyonları, Generator sınıfının methodlarını ve bellek tasarrufunu öğrendin. Sonsuz generator'lar, yield from ile delegasyon ve pipeline kurmayı gördün.

Şimdi hepsini birleştir: bir log ayrıştırıcı yazacaksın. yield ile satırları üret, yield from ile alt generator'ı delege et ve pipeline akışı kur.

Log ayrıştırma pipeline'ı

Bir log ayrıştırıcı iki generator'dan oluşur: logLines satırları tek tek üretir, errorLines yalnızca ERROR içerenleri süzer. Böylece akış kurulur; tüm satırlar belleğe yüklenmez.

Üçüncü bir generator allErrors, yield from errorLines($lines) ile delege eder. Bu, hem yield hem de yield from kullanımını birleştirir.

Uygulama logLines generator'ını yaz

logLines(array $lines): \Generator fonksiyonunu yaz: $lines dizisindeki her satırı yield ile üret. foreach ile logLines($lines) yinele ve her satırı yeni satıra yazdır.

Örnek çözümü göster
logLines fonksiyonunda foreach ($lines as $line) ile dön, yield $line;. Sonra foreach (logLines($lines) as $line) ile yinele ve echo $line . "\n"; yaz.
Örnek çözüm:
<?php
function logLines(array $lines): \Generator {
    foreach ($lines as $line) {
        yield $line;
    }
}

$lines = ["2025-01-01 INFO başlat", "2025-01-01 WARN yavaş", "2025-01-01 ERROR bağlantı"];

foreach (logLines($lines) as $line) {
    echo $line . "\n";
}

Uygulama ERROR satırlarını süz ve yield from ile delege et

errorLines(array $lines): \Generator fonksiyonu yaz: logLines($lines)'ı foreach ile yinele, strpos ile ERROR içeren satırları seç ve yield ile üret. allErrors(array $lines): \Generator fonksiyonu yaz: yield from errorLines($lines) ile delege et. foreach ile allErrors($lines) yinele ve her satırı yazdır.

Örnek çözümü göster
errorLines'ta foreach (logLines($lines) as $line) ile dön, strpos($line, "ERROR") !== false ise yield $line;. allErrors'ta yield from errorLines($lines);. Sonra foreach (allErrors($lines) as $line) ile yinele ve echo $line . "\n"; yaz.
Örnek çözüm:
<?php
function logLines(array $lines): \Generator {
    foreach ($lines as $line) {
        yield $line;
    }
}

function errorLines(array $lines): \Generator {
    foreach (logLines($lines) as $line) {
        if (strpos($line, "ERROR") !== false) {
            yield $line;
        }
    }
}

function allErrors(array $lines): \Generator {
    yield from errorLines($lines);
}

$lines = [
    "2025-01-01 INFO başlat",
    "2025-01-01 ERROR bağlantı koptu",
    "2025-01-01 WARN yavaş",
    "2025-01-01 ERROR disk dolu",
];

foreach (allErrors($lines) as $line) {
    echo $line . "\n";
}

Kendini test et

  1. Hangi yapı en az bellek harcar?

    • range(1, 1000) ile dizi oluştur
    • Tüm satırları bir diziye yükle
    • Generator ile satır satır üret
    • Tüm veriyi değişkende tut
    Cevabı göster

    Generator ile satır satır üret — Doğru. Generator tek seferde tek değer tutar; en az bellek harcar.

  2. allErrors, errorLines'ı delege etsin

    function inner(): \Generator {
        yield 'a';
        yield 'b';
    }
    
    function outer(): \Generator {
        ____ inner();
        yield 'c';
    }
    
    Cevabı göster
    function inner(): \Generator {
        yield 'a';
        yield 'b';
    }
    
    function outer(): \Generator {
        yield from inner();
        yield 'c';
    }
    

Uzman bölümündeki tüm dersler