Menu
Coddy logo textTech

Üreteçler ve Yineleyiciler

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 62 / 91.

Üreteçler, tam Iterator arayüzünü uygulamadan yineleyiciler oluşturmanın basit bir yolunu sağlar. Bir üreteç işlevi, değerleri teker teker üretmek için return yerine yield kullanır ve her değer arasında yürütmeyi duraklatır.

İşte bir sayı dizisi üreten temel bir oluşturucu:

<?php
function countTo(int $max): Generator {
    for ($i = 1; $i <= $max; $i++) {
        yield $i;
    }
}

foreach (countTo(3) as $number) {
    echo "$number\n";
}

Çıktı:

1
2
3

Temel avantaj bellek verimliliğidir. Bellekte bir dizinin tamamını oluşturmak yerine, üreteçler değerleri gerektiğinde üretir. Bu, büyük veri kümeleriyle çalışırken kritik öneme sahiptir — bir milyon kaydı işleyen bir üreteç, on kayıt işleyen bir üreteçle aynı belleği kullanır.

Üreteçler anahtar-değer çiftleri de üretebilir:

<?php
function userGenerator(): Generator {
    yield 'admin' => 'Alice';
    yield 'editor' => 'Bob';
}

foreach (userGenerator() as $role => $name) {
    echo "$role: $name\n";
}

Çıktı:

admin: Alice
editor: Bob

Kendi sınıflarınızı foreach ile yinelenebilir hâle getirmek için Iterator arayüzünü uygulayın. Ancak çoğu durumda, üreteçler daha az gereksiz kodla daha temiz bir çözüm sunar. Bir sınıfın tüm öğeleri aynı anda belleğe yüklemeden bir öğe koleksiyonunu kullanıma sunması gerektiğinde, üreteçler özellikle OOP'de kullanışlıdır.

challenge icon

Görev

Kolay

Her şeyi aynı anda belleğe yüklemeden büyük koleksiyonlar üzerinde verimli bir şekilde yineleme yapmak için oluşturucuları kullanan bir ürün envanter sistemi geliştirelim. Ürünleri depolayan ve bunlar üzerinde farklı şekillerde yineleme yapmak için oluşturucu yöntemleri sağlayan bir sınıf oluşturacaksınız.

Kodunuzu üç dosyaya ayıracaksınız:

  • Product.php: Envanterdeki bir öğeyi temsil eden bir Product sınıfı oluşturun. Genel bir $sku (string), genel bir $name (string) ve genel bir $price (float) tanımlamak için kurucu destekli özellik tanımlamasını kullanın.
  • Inventory.php: Bir ürün koleksiyonunu yöneten ve bu ürünler üzerinde yineleme yapmak için oluşturucu yöntemleri sağlayan bir Inventory sınıfı oluşturun. Product dosyasını dahil edin. Sınıf şunları yapmalıdır:
    • Ürünleri depolamak için özel bir dizi özelliğine sahip olmalıdır
    • Koleksiyona bir ürün ekleyen addProduct(Product $product) yöntemine sahip olmalıdır
    • Her ürünü bir seferde bir tane döndüren allProducts(): Generator oluşturucu yöntemine sahip olmalıdır
    • Yalnızca fiyatı verilen minimum fiyata eşit veya daha yüksek olan ürünleri döndüren ve anahtar-değer çiftleri oluşturan expensiveProducts(float $minPrice): Generator oluşturucu yöntemine sahip olmalıdır; burada anahtar SKU, değer ise üründür
  • main.php: Inventory dosyasını dahil edin. Bir girdi alacaksınız: minimum fiyat eşiği.

    Bir Inventory oluşturun ve şu üç ürünü ekleyin:

    • SKU: "A001", Ad: "Laptop", Fiyat: 999.99
    • SKU: "A002", Ad: "Mouse", Fiyat: 29.99
    • SKU: "A003", Ad: "Monitor", Fiyat: 349.99

    İlk olarak allProducts() üzerinde yineleme yapın ve her ürünün adını kendi satırına yazdırın.

    Ardından boş bir satır yazdırın ve giriş eşiğini kullanarak expensiveProducts() üzerinde yineleme yapın. Her pahalı ürün için kendi satırına "[sku]: [name] - $[price]" yazdırın. Fiyatı tam olarak 2 ondalık basamakla biçimlendirin.

Bu görev, oluşturucuların koleksiyonlar üzerinde tembel bir şekilde yineleme yapmanıza nasıl olanak tanıdığını gösterir: her ürün yalnızca istendiğinde döndürülür; bu da bu yaklaşımı büyük envanterler için bellek açısından verimli kılar. expensiveProducts() içindeki anahtar-değer döndürme, oluşturucuların yapılandırılmış yineleme verileri sağlayabileceğini gösterir.

Kendin dene

<?php

require_once 'Inventory.php';

// Girdiyi oku
$minPrice = floatval(trim(fgets(STDIN)));

// TODO: Bir Inventory örneği oluştur

// TODO: Üç ürün ekle:
// SKU: "A001", Name: "Laptop", Price: 999.99
// SKU: "A002", Name: "Mouse", Price: 29.99
// SKU: "A003", Name: "Monitor", Price: 349.99

// TODO: allProducts() üzerinde dolaş ve her ürünün adını yazdır

// TODO: Boş bir satır yazdır

// TODO: $minPrice kullanarak expensiveProducts() üzerinde dolaş
// Her pahalı ürün için "[sku]: [name] - $[price]" yazdır
// Fiyatı tam olarak 2 ondalık basamakla biçimlendir

?>
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi