PHP IteratorIterator sınıf nasıl çalışır?

3 Cevap php

Ben IteratorIterator sınıf aslında ne başımı alamıyorum olabilir gibi deneyin. Ben motor, kullanarak foreach döngü and Seni IteratorIterator bir Iterasyon içine Traversable olan her şeyi dönüştürmek gerekiyordu olduğunu fark edebilirsiniz ama beni yaşam için nasıl anlayamıyorum bilir böylece sınıflar Traversable uygulayabilirsiniz anlıyorum.

Örneğin, PDOStatement class alın; nasıl standart Iterator yöntemleri (sonraki, anahtar, vb, geri sarma) PDOStatement yineleme izin uygulanmıştır olurdu?

Benim soru belirsiz Üzgünüm, ben sadece bu sınıf için tam nedenini kavramak için mücadele ediyorum ve bunun üzerine belgeler yetersizdir.

Teşekkürler,

Irade

Güncelleme: Phpt dosyaları geçiyor, ben IteratorIterator kullanan bir testi bulundu:

<?php

$root = simplexml_load_string('<?xml version="1.0"?>
<root>
    <child>Hello</child>
    <child>World</child>
</root>
');

foreach (new IteratorIterator($root->child) as $child) {
    echo $child."\n";
}

?>

Beklenen çıktısı:

Hello
World

Gerçekten IteratorIterator yapı bir argüman olarak $ root-> çocuğu alır ve nasıl alt öğeler üzerinde yineleme için nasıl yönettiğini takip etmiyorum.

3 Cevap

Dayanarak this, ben bunu fazla İtere nesneleri yineleme sağlar düşünüyorum. Yani Eğer ana nesne diğer nesneleri çekin ve ana nesne üzerinde IteratorIterator kullanarak, çocuk da nesneleri yineleme olabilir.

GÜNCELLEME: Lütfen güncelleme dayanarak. Orada sadece tek bir kök nesnesi, bu yüzden yineleme gerçekten bu örnekte geçerli değildir ama bu, benim için mantıklı, ancak daha fazla kök nesne vardı eğer. Diğer bir deyişle, her nesnenin IteratorIterator tüm öğeleri bilmek zorunda kalmadan, iç içe foreach döngüleri sahip olarak aynı olduğunu düşünüyorum. Diğer bir deyişle, nesne yönelimli nesneleri kullanarak iç içe bir foreach ... gereksiz bir deyim var. :-)

Eğer henüz bulamadıysanız, http://www.phpro.org/tutorials/Introduction-to-SPL.html size yardımcı olabilecek birkaç örnek vardır.


IteratorIterator>

  • "This iterator wrapper allows the conversion of anything that is Traversable into an Iterator."

Sürülebilir>

  • "Interface to detect if a class is traversable using foreach."
  • "Internal (built-in) classes that implement this interface can be used in a foreach construct and do not need to implement IteratorAggregate or Iterator."
  • "This is an internal engine interface which cannot be implemented in PHP scripts. Either IteratorAggregate or Iterator must be used instead."

Site kullanışlı olabilecek bazı RecursiveIteratorIterator örnekler var ama, if i get it right, IteratorIterator görüntüsü (en azından foreach için kullanılan) oldukça yararsız betik nokta değil.

Bu Iterateable Traversable arabirimi uygulayan Nesneler üzerinden Nesneler oluşturur, ama Traversable arabirimini uygulayan stajyer sınıfları zaten foreachable ve komut Traversable uygulayamaz ...

(Dokümanlar söz değil, SimpleXMLElement Traversable uyguluyor)

i thought example #2 here is quite straight forward...
it basically lets you implement a specific behavior for your class for the next/previous/current/rewind/key array functions, expected by the php foreach parser.

böylece soru uygulanması için, bir örnek için PDOStatement aramak için :: bir sonraki deyimi dönmek sonraki getirme yöntemini kullanmak yerine, kendi memeber gibi bir PDOStatement bir Iterator sınıf yaratacak. Bunu saklayarak perivous ve akımı hem de uygulamaya izin verir. havn't çok bu sınıf kullanmış ama ben bir geri sarma ve anahtar uygulamak o kadar da zor değildir eminim. bu yüzden ayrıntılar üzerinde yanlış olabilir, ama ben kavramı açık olması gerektiğini düşünüyorum, bu sinek olduğuna dikkat