2009-09-02 32 views
5

試試我可能無法理解IteratorIterator類實際執行的操作。我知道類可以實現Traversable,因此引擎知道它可以循環使用foreach 我意識到IteratorIterator應該將任何可以穿越的東西都轉換成迭代器,但是我不能爲我的生活理解如何。PHP IteratorIterator類如何工作?

舉例來說,PDOStatement類;標準Iterator方法(next,key,rewind等)將如何實現以允許迭代PDOtatement?

對不起,如果我的問題不清楚,我只是努力去掌握這個類的確切原因,而且它的文檔很少。

感謝,

威爾

更新:通過PHPT文件去,我發現了一個測試,使用IteratorIterator:

<?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"; 
} 

?> 

的預期結果是:

Hello 
World 

我並不真正遵循IteratorIterator構造如何將$ root-> child作爲一個參數以及它如何管理迭代子元素。

+0

我找到了答案[here](http://blog.ircmaxell.com/2011/10/iteratoriterator-php-inconsistencies.html)。 但在我看來,IteratorIterator現在變得不重要了,不是嗎? – akond

回答

1

根據this,我認爲它可以讓你迭代迭代對象。即您可以在主對象中拉出其他對象,並在主對象上使用IteratorIterator,也可以迭代子對象。

更新:根據您的更新。這對我來說很有意義,儘管只有一個根對象,所以迭代它在這個例子中並不適用,但是如果有更多的根對象,你可以。換句話說,我相信IteratorIterator和嵌套的foreach循環是一樣的,而不必知道每個對象的所有元素。換句話說,使用面向對象的對象的嵌套foreach ...有一個冗餘的語句。 :-)

0

我以爲例如#2 here是相當簡單...
它基本上可以讓你實現你的類中的特定行爲的下一個/上/電流/快退/按鍵陣列功能,在PHP的foreach解析器預期。

因此,爲了實現您的問題,我們將創建一個帶有PDOStatement作爲其記憶的Iterator類,比如使用下一個方法調用PDostatement :: fetch來返回其下一個語句。存儲它可以讓你實現流量和流量。雖然沒有太多地使用這個類,但我敢打賭,這不是很難實現倒帶和關鍵。請注意,這是動態的,所以我可能是錯的細節,但我認爲這個概念應該清楚

+0

我不知道我關注。您鏈接到的示例討論標準Iterator而不是IteratorIterator類(http://us2.php.net/manual/en/class.iteratoriterator.php)。你能澄清一下嗎? – WilliamMartin

2

如果你還沒有找到它,https://www.phpro.org/tutorials/Introduction-to-SPL.html有幾個例子可以幫助你。


IteratorIterator>

  • 「這個迭代包裝允許 轉換的任何是 Traversable的成迭代。「

Traversable的>

  • 」接口,以檢測是否一類是 穿越使用的foreach。「
  • 」 內部的是 實現此接口(內置)的類可被用 一個foreach結構並不需要實現迭代器集合 或迭代器。「
  • 」這是一個內部引擎接口 其中c注意在PHP 腳本中實施。無論是IteratorAggregate或 迭代器必須被使用。」

該網站有一些RecursiveIteratorIterator例子,如果我得到正確這可能是很方便,但,IteratorIterator是看沒什麼用腳本點(使用時至少到的foreach)。

它創建Iterateable對象了實現Traversable接口的對象,但實現Traversable接口的實習生類foreachable反正和腳本無法實現Traversable的...

(文中未提及,SimpleXMLElement正在實現Traversable)