Yineleyiciyi hangi uygulama neden PHP kullanmak ve gerekir?

2 Cevap php

Ben büyük, eski bir proje refactor çalışıyorum ve ben fark ettik bir şey farklı Iterator uygulamaları bir aralığı:

while($iterator->moveNext()) {
    $item = $iterator->current();
    // do something with $item;
}   

for($iterator = getIterator(), $iterator->HasNext()) {
    $item = $iterator->Next();
    // do something with $item
}   

while($item = $iterator->fetch()) {
    // do something with item
}

veya izin bile StandardPHPLibrary (SPL) yineleyici

foreach($iterator as $item) {
    // do something with $item
}

Having so many different Iterators (with different methods for looping over collections) seems like a strong code smell, and I'm inclined to refactor everything to SPL. Is there a compelling advantage to any of these implementations of Iterator, or is it purely a matter of personal taste?

2 Cevap

SPL sürümü kesinlikle gitmek için yoludur. Okumak kolay, ama şimdi PHP bir parçası, çok daha fazla insan tanıdık olacak değil.

Orada başkaları ile "yanlış" bir şey, ama belirtildiği gibi, tek bir projede tüm bu farklı sürümleri olan kimseye yardım etmiyor.

Bir arayüz ön ucunda kullanımda daha az çirkin eğilimi Imo, sadece SPL kitaplıkları bir veya daha fazla kullanılması ile gerçekleştirilir. Ancak, uygulama arkasındaki destek biraz çirkin alabilirsiniz.

(: $ Obj [5] IE), tüm isteyeceği Örneğin, ben talep asla sonuç istek pointer getirilen asla ve öğeleri erken getirilen olsaydı, böylece verimli bir veritabanı sonuç kümesi iterated bir yineleyici yazdı bir iç tampon içine gerekli sonuçları.

Harika çalıştı, sadece onlar bir dizi gibi görünen bir şey kullanmak görmek zaman insanların kafasını karıştıran ve bu başarısız olabilir "sihirli" yapar, çünkü perde arkasında sihirli asla başarısız kılan kodu dua :)

Sihirli insanlar yakılan var. Bu yüzden dikkatli kullanmak ve akıllıca, muhtemelen nasıl çalıştığını açık olun.

Benim kişisel tercihi için

for( $object as $i => $v )

Bunun için gösterim genellikle daha tutarlı ve öngörülebilir.

for( $dbresult->iterator() as $i => $v ){ 

}

stili gösterimde işlevsel aynıdır, ama en azından bunu yüzeyde nasıl çalıştığını az varsayımları var.