Iterator パターンは、非常に一般的なプロセス、つまりオブジェクト グラフの未知の部分にあるオブジェクト (またはスカラー) のコレクションの反復に対する抽象化を提供します。反復は、配列プロパティ、コレクション オブジェクト、配列、さらにはクエリ結果セットの反復など、いくつかの異なる方法で実行できます。
オブジェクトの世界では、イテレータ パターンは配列のような機能を維持し、非侵入的なオブジェクト ファセットとしてみなされる必要があり、多くの場合、クライアント クラスはイテレータ インターフェイスを参照して実際のオブジェクト実装から分離されます。可能な限り、将来変更される可能性のある具体クラスまたは抽象クラスの代わりに、イテレータへの参照を渡すことができます。
参加者:
◆クライアント: Iterator パターンを参照するメソッドは、一連の値またはオブジェクトに対してループを実行します。
◆イテレーター: next()、isFinished()、current() およびその他のメソッドを含む、反復プロセスの抽象化。
◆ConcreteIterators: 配列、ツリー、組み合わせ、コレクションなどの特定のオブジェクトのセットに対する反復を実装します。
Traversable インターフェイスを通じて、PHP はイテレーター モードをネイティブにサポートします。このインターフェイスは、Iterator と IteratorAggregate によって拡張され、一連の標準メソッドを定義するだけでなく、各 Traversable オブジェクトをそのまま foreach () に渡すことができます。 foreach はイテレータのメイン クライアントであり、Iterator 実装は実際のイテレータであり、IteratorAggregate は他の役割を持つ Traversable オブジェクトであり、 getIterator() メソッドを通じて Iterator を返します。
標準 PHP ライブラリは、PHP にバンドルされている唯一の汎用オブジェクト指向ライブラリであり、追加のインターフェイスとパブリック クラスを定義します。 OuterIterator 実装は、Iterator を装飾します。CachingIterator と LimitIterator は、このインターフェイスの 2 つの例です。
RecursiveIterator は、ツリー構造用に実装された Iterator インターフェイスの拡張機能であり、反復内の現在の要素のサブオブジェクトが存在するかどうかを確認する一連の追加メソッドを定義します。 RecursiveArrayIterator および RecursiveDirectoryIterator は、このインターフェイスの実装の例です。これらのタイプのイテレータは、そのまま使用することも、RecursiveIteratorIterator を使用して通常のイテレータ コントラクトにブリッジすることもできます。このOuterIterator実装は、構築パラメータに応じて深さ優先または幅優先のトラバーサルを実行します。
RecursiveIteratorIterator を使用する場合、それを foreach に渡すことができます。RecursiveIterator とそのスーパーセット Iterator のさまざまな使用法を理解するには、次のコード例を参照してください。最後に、SeekableIterators は、seek() メソッドをコントラクトに追加します。このメソッドは、Iterator の内部状態を特定の反復ポイントに移動するために使用できます。
注意、イテレータはオブジェクトセットよりも優れた抽象化です。InfiniteIterators、NoRewindIteratorsなどを通常の配列配列と矛盾させることができるため、イテレータにはcount()関数などの関数がありません。
SPL イテレータの完全なリストは、公式 PHP マニュアルにあります。 PHP の強力なサポートのおかげで、イテレータ パターンを使用する作業のほとんどが標準実装に含まれています。次のコード例では、標準の Iterator と RecursiveIterators の機能を利用しています。
コードをコピーします コードは次のとおりです:
/**
* 数値配列をラップするコレクション。
* Iterator インターフェイスを実装するには、5 つのパブリック メソッドすべてが必要です。
* Iterator インターフェイス。
*/
class Collection は Iterator を実装します
{
private $_content;
プライベート $_index = 0;
public function __construct(array $content)
{
$this->_content = $content;
}
パブリック関数 rewind()
{
$this->_index = 0;
}
public function valid()
{
return isset($this->_content[$this->_index]);
}
public function current()
{
return $this->_content[$this->_index];
}
public function key()
{
return $this->_index;
}
public function next()
{
$this->_index++;
}
}
$array = array('A', 'B', 'C', 'D');
echo "コレクション: ";
foreach (new Collection($array) as $key => $value) {
echo "$key => $value. ";
}
echo "n";
/**
* 通常、実装するインターフェイスは IteratorAggregate です。
* メソッドは 1 つだけで、Iterator を返す必要があります
* すでに別のクラス (ArrayIterator など) として定義されています
* Iterator はアルゴリズムをより細かく制御できます。
* Iterator のコントラクトのすべてのフックポイントが利用可能であるため、
*実装のために。
*/
クラス NumbersSet は IteratorAggregate を実装します
{
private $_content;
public function __construct(array $content)
{
$this->_content = $content;
}
public function contains($number)
{
return in_array($number, $this->_content);
}
/**
* IteratorAggregateの実装に必要なメソッドはこのメソッドのみです。
* @return イテレータ
*/
public function getIterator()
{
return new ArrayIterator($this->_content);
}
}
echo "NumbersSet: ";
foreach (new NumbersSet($array) as $key => $value) {
echo "$key => $value. ";
}
echo "n"; :
array(
array(
' E',
'F'
),
array(
'G',
'H',
'I'
)
)
));
// $it は RecursiveIterator ですが、Iterator でもあります。
// したがって、通常は配列の 4 つの要素
// をループします。
echo "RecursiveIterator に対する Foreach: ";
foreach ($it as $value) {
echo $value;
// ただし、RecursiveIterators は追加の
// 子ノードを探索するためのメソッドを指定します
$children = $it->hasChildren() ? '{はい・いいえ}';
echo $children, ' ';
}
echo "n";
//
// RecursiveIteratorIterator を介して別のコントラクトにブリッジできます。その不可解な名前は
// ' をまたぐイテレータ
//
echo "。 RecursiveIteratorIterator に対する Foreach: ";
foreach (new RecursiveIteratorIterator($it) as $value) {
echo $value;
}
echo "n";
http://www.bkjia.com/PHPjc/327554.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327554.html技術記事 Iterator パターンは、非常に一般的なプロセス、つまりオブジェクト グラフの未知の部分にあるオブジェクト (またはスカラー) のコレクションの反復に対する抽象化を提供します。いくつかの繰り返しがあります...