CodeBlanks Logo Icon CodeBlanks

Meydan okuma - Generator ve Closure

PHP kursu · Uzman · Ders 50/54

Generator, yield from ve closure'la büyük veri akışı işleyen bir ETL yazarsın.

Generator ile lazy ETL hattı

Bu beş derslik uzman finalinde tüm expert konuları birleştiren bir mini uygulama yapacaksın. İlk derste ETL hattı kuruyorsun: readRows satırları tek tek yield ile üretir, transform bir closure ile her satırı dönüştürür, pipeline yield from ile iki generatorü devreder, loadAll sonucu diziye toplar.

Generator'lar büyük veriyi belleğe yüklemeden işler; her satır istendiğinde üretilir. Closure ve arrow function (fn) sayesinde dönüşüm adımı tek satırda yazılır. Bu temel, sonraki derslerde reflection ve performans katmanları için kullanılacak.

Uygulama ETL hattını yaz

ETL hattını yaz. readRows(array $rows): Generator her satırı tek tek yield ile üretir. transform(iterable $rows, callable $fn): Generator her satırı $fn ile dönüştürür. pipeline(array $rows, callable $fn): Generator yield from ile readRows + transform zincirini devreder. loadAll(iterable $rows): array tüm satırları diziye toplar.

Demo: $rows = [["name" => "kale", "price" => 5], ["name" => "defter", "price" => 15]]. pipeline'a arrow function ver: fn($r) => ["name" => strtoupper($r["name"]), "price" => $r["price"] * 2]. loadAll ile topla ve her satırı "{name}: {price}\n" olarak yazdır.

Örnek çözümü göster
her satırı yield ile üret. transform: callable fn ile her satırı dönüştür. pipeline: yield from ile readRows + transform zincirini devreder. loadAll: sonucu diziye topla. Demo'yu yaz ve çıktıyı üret.
Örnek çözüm:
<?php
// ETL hattı: readRows + transform + pipeline + loadAll

function readRows(array $rows): Generator {
    foreach ($rows as $row) {
        yield $row;
    }
}

function transform(iterable $rows, callable $fn): Generator {
    foreach ($rows as $row) {
        yield $fn($row);
    }
}

function pipeline(array $rows, callable $fn): Generator {
    yield from transform(readRows($rows), $fn);
}

function loadAll(iterable $rows): array {
    $out = [];
    foreach ($rows as $row) {
        $out[] = $row;
    }
    return $out;
}

// Demo:
$rows = [
    ["name" => "kale", "price" => 5],
    ["name" => "defter", "price" => 15],
];
$result = loadAll(pipeline($rows, fn($r) => [
    "name" => strtoupper($r["name"]),
    "price" => $r["price"] * 2,
]));
foreach ($result as $row) {
    echo $row["name"] . ": " . $row["price"] . "\n";
}

Closure pipeline'ın gücü

Closure pipeline, veriyi adım adım işlemenin zarif bir yoludur. Her adım bir callable alır ve sonucu bir sonraki adıma aktarır. Generator'larla birleşince bellek dostu olur: binlerce satırı aynı anda belleğe yüklemeden işleyebilirsin.

Arrow function fn($r) => ifade tek satırlık dönüşümleri kısa yazar; dış değişkeni otomatik yakalar. yield from iç içe generator'leri tek akışta birleştirir. Bu desen sonraki derslerde reflection ve performans katmanlarına taşınır; her derste bir parça ekleyeceksin.

Kendini test et

  1. yield anahtar sözcüğü ne yapar?

    • Bir değeri üretir ve çağırana döndürür, sonra bekletir
    • Fonksiyonu tamamen sonlandırır
    • Tüm diziyi belleğe yükler
    • Bir istisna fırlatır
    Cevabı göster

    Bir değeri üretir ve çağırana döndürür, sonra bekletir — Doğru. yield bir değer üretir, çağırana verir ve bir sonraki çağrıda kaldığı yerden devam eder.

  2. yield from ifadesini tamamla

    function pipeline(array $rows, callable $fn): Generator {
        ____ transform(readRows($rows), $fn);
    }
    Cevabı göster
    function pipeline(array $rows, callable $fn): Generator {
        yield from transform(readRows($rows), $fn);
    }
  3. ETL ve generator kavramlarını eşleştir

    yield
    Tek değer üretir
    yield from
    İç generatorü devreder
    Generator
    Lazy iterator arayüzü
    callable
    Fonksiyon referansı

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