ホームページ  >  記事  >  バックエンド開発  >  PHP デザインパターンの話: イテレータパターン (3)_PHP チュートリアル

PHP デザインパターンの話: イテレータパターン (3)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:44:10721ブラウズ

InfiniteIterators、NoRewindIterators などを通常の配列と矛盾させることができるため、イテレータはオブジェクト セットよりも優れた抽象化であることに注意してください。したがって、Iterator には count() 関数などの関数がありません。
SPL イテレータの完全なリストは、公式 PHP マニュアルにあります。 PHP の強力なサポートのおかげで、イテレータ パターンを使用する作業のほとんどが標準実装に含まれています。次のコード例では、標準の Iterator と RecursiveIterators の機能を利用しています。

___FCKpd___0/**   * 通常、実装するインターフェイスは IteratorAggregate です。   * メソッドは 1 つだけあり、Iterator を返す必要があります。 * すでに別のクラスとして定義されています (ArrayIterator など) * Iterator はアルゴリズムをより細かく制御できます。 * Iterator コントラクトのすべてのフック ポイントが実装に利用できるためです。  */ class NumbersSet は IteratorAggregate を実装します {

private 今日の「PHP デザイン パターン」シリーズの主役は、オブジェクト グラフの未知の部分にあるオブジェクト (またはスカラー) のセットに対する反復という、非常に一般的なプロセスの抽象化を提供する Iterator パターンです。反復は、配列プロパティ、コレクション オブジェクト、配列、さらにはクエリ結果セットの反復など、いくつかの異なる方法で実行できます。


オブジェクトの世界では、反復子パターンは配列のような関数を維持し、非侵入的なオブジェクト ファセットとして見なされるべきです。多くの場合、クライアント クラスは実際のオブジェクト実装から分離され、反復子インターフェイスを参照します。可能な限り、将来変更される可能性のある具体クラスまたは抽象クラスの代わりに、イテレータへの参照を渡すことができます。 迭代器模式 図 1 Iterator パターン
参加者:
◆クライアント: Iterator パターンのメソッドを参照して、一連の値またはオブジェクトに対してループを実行します。
◆Iterator (イテレーター): next()、isFinished()、current() などのメソッドを含む、反復プロセスの抽象化。
◆ConcreteIterators: 配列、ツリー、組み合わせ、コレクションなどの特定のオブジェクトのセットに反復を実装します。
Traversable インターフェイスを通じて、PHP はイテレーター モードをネイティブにサポートします。このインターフェイスは、Iterator と IteratorAggregate によって拡張され、一連の標準メソッドを定義するだけでなく、各 Traversable オブジェクトをそのまま foreach () に渡すことができます。 foreach はイテレータのメイン クライアントであり、Iterator 実装は実際のイテレータであり、IteratorAggregate は他の役割を持つ Traversable オブジェクトであり、 getIterator() メソッドを通じて Iterator を返します。

PHP架构

標準 PHP ライブラリは、PHP にバンドルされている唯一の汎用オブジェクト指向ライブラリであり、追加のインターフェイスとパブリック クラスを定義します。 OuterIterator 実装は、Iterator を装飾します。CachingIterator と LimitIterator は、このインターフェイスの 2 つの例です。

RecursiveIterator は、ツリー構造用に実装された Iterator インターフェイスの拡張機能であり、反復内の現在の要素のサブオブジェクトが存在するかどうかを確認する一連の追加メソッドを定義します。 RecursiveArrayIterator および RecursiveDirectoryIterator は、このインターフェイスの実装の例です。これらのタイプのイテレータは、そのまま使用することも、RecursiveIteratorIterator を使用して通常のイテレータ コントラクトにブリッジすることもできます。このOuterIterator実装は、構築パラメータに応じて深さ優先または幅優先のトラバーサルを実行します。
RecursiveIteratorIterator を使用する場合は、それを foreach に渡すことができます。RecursiveIterator とそのスーパーセット Iterator のさまざまな使用法を理解するには、次のコード例を参照してください。最後に、SeekableIterators は、seek() メソッドをコントラクトに追加します。このメソッドは、Iterator の内部状態を特定の反復ポイントに移動するために使用できます。

http://www.bkjia.com/PHPjc/478775.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478775.html技術記事通常の配列と一貫性を持たずに InfiniteIterators、NoRewindIterators などを作成できるため、イテレータはオブジェクト セットよりも優れた抽象化であることに注意してください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。