2009-09-02 5 views
5

私はIteratorIteratorクラスが実際に何をしているのか頭を上げることはできません。私はクラスがTraversableを実装できることを理解しているので、エンジンはforeachを使ってループすることができると知っています IteratorIteratorはTraversableなものをIteratorに変換するはずですが、PHP IteratorIteratorクラスはどのように機能しますか?

たとえば、PDOStatementクラスを取ります。どのように標準イテレータメソッド(次、キー、巻き戻しなど)を実装して、PDOStatementに対する反復を可能にしますか?

申し訳ありません私の質問が不明な場合、私はこのクラスの正確な理由を把握するのに苦労しており、そのドキュメントはほとんどありません。

おかげで、

ウィル

更新: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をどのように取るかを実際には追いつかない引数とそれが子要素を反復処理する方法。私は例#2 hereはかなりまっすぐ進むと思っ

+0

[こちら](http://blog.ircmaxell.com/2011/10/iteratoriterator-php-inconsistencies.html)の回答が見つかりました。 しかし、IteratorIteratorは今や重要ではないようですね。 – akond

答えて

1

thisに基づいて、繰り返しオブジェクトを反復することができます。私。マスターオブジェクト内の他のオブジェクトをプルすることができ、マスターオブジェクト上のIteratorIteratorを使用して、子オブジェクトも反復処理できます。

更新:お客様のアップデートに基づいています。これは私にとって理にかなっていますが、ルートオブジェクトが1つしかないので、この例では実際には適用されませんが、ルートオブジェクトがそれ以上ある場合は可能です。言い換えれば、IteratorIteratorは、各オブジェクトのすべての要素を知る必要なく、ネストされたforeachループを持つことと同じだと私は考えます。言い換えれば、オブジェクト指向のオブジェクトを使用するネストされたforeach ...冗長なステートメントがあります。 :-)

0

...
それは基本的にあなたがPHPのforeachのパーサによって予想される次/前/現在/巻き戻し/キー配列関数、のためにあなたのクラスのための具体的な動作を実装することができます 。

あなたの質問を実装するために、PDOStatementをメンバとして持つIteratorクラスを作成します。たとえば、次のメソッドを使用してPDOStatement :: fetchを呼び出して次のステートメントを返します。それを格納すると、perivousとcurrentの両方を実装できます。このクラスをあまり使っていないのですが、巻き戻しとキーを実装するのは難しくありません。これはオンザフライであるため、詳細については間違っているかもしれませんが、私はコンセプトを明確にすべきだと思います。

+0

私は私が従うかどうか分からない。リンクした例で、IteratorIteratorクラス(http://us2.php.net/manual/en/class.iteratoriterator.php)ではなく、標準のIteratorについて説明します。明確にしていただけますか? – WilliamMartin

2

まだ見つからなかった場合は、https://www.phpro.org/tutorials/Introduction-to-SPL.htmlにいくつかの例があります。


IteratorIterator>

  • 「このイテレータラッパーは、イテレータにTraversableの あるものの 変換することができます。"

Traversableの>

  • "クラスは トラバース使用foreachのであればインタフェースを検出する。"
  • " 内部をこのインタフェースを実装 (ビルトイン)クラスで を使用することができますforeachのコンストラクタではありません。 は、IteratorAggregate またはIteratorを実装する必要があります。 "
  • "これは内部エンジンインターフェイス です.c注釈はPHP スクリプトで実装することができます。 IteratorAggregateや イテレータのいずれかを代わりに使用する必要があります。」

サイトでは、私は右のそれを得れば、IteratorIteratorはビューのスクリプトポイントからかなり無用で便利かもしれないいくつかのRecursiveIteratorIterator例がありますが、

Traversableインターフェイスを実装するオブジェクトから反復可能オブジェクトを作成しますが、Traversableインターフェイスを実装するインターンクラスは、とにかくforeachableであり、スクリプトはTraversableを実装できません。

(SimpleXMLElementはTraversableを実装しています)

関連する問題