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

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

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

今日の「PHP デザイン パターン」シリーズの主役は、非常に一般的なプロセス、つまりオブジェクト グラフの未知の部分にあるオブジェクト (またはスカラー) のセットの反復に関する抽象化を提供する Iterator パターンです。反復は、配列プロパティ、コレクション オブジェクト、配列、さらにはクエリ結果セットの反復など、いくつかの異なる方法で実行できます。
オブジェクトの世界では、イテレータ パターンは配列のような機能を維持し、非侵入的なオブジェクト ファセットとしてみなされる必要があり、多くの場合、クライアント クラスはイテレータ インターフェイスを参照して実際のオブジェクト実装から分離されます。可能な限り、将来変更される可能性のある具体クラスまたは抽象クラスの代わりに、イテレータへの参照を渡すことができます。

迭代器模式
図 1 イテレータ パターン

参加者:

◆クライアント: イテレータ パターンを参照するメソッドは、一連の値またはオブジェクトに対してループを実行します。

◆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 の内部状態を特定の反復ポイントに移動するために使用できます。

www.bkjia.com本当http://www.bkjia.com/PHPjc/478777.html技術記事今日の「PHP デザイン パターン」シリーズの主役は、非常に一般的なプロセス、つまりオブジェクト グラフの未知の部分にあるオブジェクトのセットの抽象化を提供する Iterator パターンです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。