5

IteratorIteratorクラスが実際に行うことについて頭を悩ませることができないかもしれないので試してみてください。クラスはTraversableを実装できるので、エンジンはforeach使用してループできることを認識し、IteratorIteratorはTraversableをIteratorに変換することになっていることを理解していますが、私はその方法を一生理解できません。

たとえば、PDOStatementクラスを取り上げます。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を引数として取る方法と、子要素を反復処理する方法については、実際にはフォローしていません。

4

3 に答える 3

2

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


IteratorIterator>

  • 「このイテレータラッパーを使用すると、トラバース可能なものをすべてイテレータに変換できます。」

トラバース可能>

  • 「foreachを使用してクラスがトラバース可能かどうかを検出するためのインターフェース。」
  • 「このインターフェースを実装する内部(組み込み)クラスは、foreach構造で使用でき、IteratorAggregateまたはIteratorを実装する必要はありません。」
  • 「これは、PHPスクリプトでは実装できない内部エンジンインターフェイスです。代わりに、IteratorAggregateまたはIteratorのいずれかを使用する必要があります。」

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

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

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

于 2010-06-06T01:48:44.223 に答える
2

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

更新:更新に基づきます。これは私には理にかなっていますが、ルートオブジェクトは1つしかないため、この例では反復は実際には適用されませんが、ルートオブジェクトがもっとある場合は適用できます。言い換えると、IteratorIteratorは、各オブジェクトのすべての要素を知らなくても、foreachループをネストするのと同じだと思います。言い換えれば、オブジェクト指向オブジェクトを使用するネストされたforeach...冗長なステートメントがあります。:-)

于 2009-09-02T13:30:03.820 に答える
0

ここでの例2は非常に単純だと思いました...
基本的に、php foreachパーサーで期待される、次/前/現在/巻き戻し/キー配列関数のクラスに特定の動作を実装できます。

したがって、質問を実装するには、PDOStatementをメンバーとしてIteratorクラスを作成します。たとえば、nextメソッドを使用してPDOStatement :: fetchを呼び出し、次のステートメントを返します。それを保存すると、perivousとcurrentの両方を実装できます。このクラスはあまり使用していませんが、巻き戻しとキーを実装するのはそれほど難しいことではないと思います。これはオンザフライであるため、詳細が間違っている可能性があることに注意してください。ただし、概念は明確である必要があると思います。

于 2009-09-02T12:13:45.487 に答える