Ü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
3Temel 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: BobKendi 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.
Görev
KolayHer ş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 birProductsı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 birInventorysı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(): Generatoroluş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): Generatoroluş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
Inventoryoluş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.- SKU:
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
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi