PHP IteratorIterator クラスはどのように機能するのでしょうか?

StackOverflow https://stackoverflow.com/questions/1366925

  •  21-09-2019
  •  | 
  •  

質問

IteratorIterator クラスが実際に何をするのか、どうやっても理解できません。クラスが Traversable を実装できるため、エンジンが foreach を使用してループできることを認識できることを理解しています そして IteratorIterator が Traversable なものを Iterator に変換することになっているのは理解していますが、その方法が一生理解できません。

たとえば、 PDOステートメント クラス;PDOStatement の反復を可能にするために、標準の Iterator メソッド (next、key、rewind など) をどのように実装すればよいでしょうか?

質問が曖昧でしたら申し訳ありませんが、このクラスの正確な理由を理解するのに苦労しているだけで、それに関するドキュメントが不足しています。

ありがとう、

意思

アップデート:phpt ファイルを調べていると、IteratorIterator を使用するテストが 1 つ見つかりました。

<?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 を引数としてどのように受け取るのか、また子要素をどのように反復処理するのか、私はあまり理解していません。

役に立ちましたか?

解決

こののに基づいて、私はそれはあなたが繰り返し処理することを可能にすると思います繰り返し処理するオブジェクト。即ちあなたはマスターオブジェクト内の他のオブジェクトを引き、あなたのマスターオブジェクト上IteratorIteratorを使用して、子供が同様にオブジェクトを反復処理することができます。

UPDATE:あなたの更新に基づいています。唯一のルートオブジェクトがありますが、これは、私には理にかなっているので、より多くのルートオブジェクトがあった場合、あなたは可能性があり、それは本当にこの例では適用されません反復、しかし。換言すれば、私はIteratorIterator各オブジェクトのすべての要素を知らなくても、ネストされたforeach文を有する同じであると考えています。つまり、オブジェクト指向のオブジェクトを使用して、ネストしたforeachのは...冗長ステートメントがあります。 : - )

他のヒント

まだ見つからない場合は、 https://www.phpro.org/tutorials/ Introduction-to-SPL.html 役立つかもしれない例がいくつかあります。


イテレータイテレータ >

  • "このイテレータラッパーは、 あるものなら何でも変換 Iterator にトラバース可能。

横断可能 >

  • "インターフェイスは、クラスが Traversable using Foreach を使用します。
  • "内部 (組み込み) クラスでは、 このインターフェイスを実装することができます foreach コンストラクトで、 IteratorAggregateを実装する必要がある またはイテレータ。
  • 「これは内部エンジンインターフェースです PHPでは実装できません スクリプト。IteratorAggregate または 代わりにイテレータを使用する必要があります。

このサイトには便利な RecursiveIteratorIterator のサンプルがいくつかありますが、 私が正しく理解できれば, IteratorIterator は、スクリプトの観点から見ると、(少なくとも foreach に使用する場合には) かなり役に立ちません。

Traversable インターフェイスを実装するオブジェクトから Iterateable オブジェクトを作成しますが、Traversable インターフェイスを実装するインターン クラスはいずれにしても foreachable であり、スクリプトは Traversable を実装できません...

(ドキュメントには記載されていませんが、SimpleXMLElement は Traversable を実装しています)

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

たとえばをPDOStatementを呼び出すために次のメソッドを使用よりも、あなたの質問を実現するために、1は、そのmemeberなどのPDOStatementとイテレータクラスを作成しますので、

::その次のステートメントを返すためにフェッチ。それはあなたがperivousと電流の両方を実装できるようになる保存します。あまり使用され、このクラスをやりなさいしかし、私はそれが難しいO巻き戻し、キーを実装していない賭け。私は詳細に間違っているかもしれないので、これはその場であることに注意してください、しかし、私はコンセプトが明確にすべきだと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top