PHP
Özet - Generator'lar
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
-
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.
-
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';
}
Sıradaki ders: Closure sınıfı