23

IteratorAggregate外部 Iterator を作成するためのインターフェースです。

class myData implements IteratorAggregate
{
    public $property1 = "Public property one";
    public $property2 = "Public property two";
    public $property3 = "Public property three";

    public function __construct()
    {
        $this->property4 = "last property";
    }

    public function getIterator()
    {
        return new ArrayIterator($this);
    }
}

$obj = new myData;

そして、次を使用してオブジェクトをトラバースできますforeach

foreach($obj as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

WhileIteratorは、外部反復子または内部で反復できるオブジェクトのインターフェイスです

class myIterator implements Iterator
{
    private $position = 0;
    private $array = array('one', 'two', 'three');

    function rewind()
    {
        $this->position = 0;
    }

    function current()
    {
        return $this->array[$this->position];
    }

    function key()
    {
        return $this->position;
    }

    function next()
    {
        ++$this->position;
    }

    function valid()
    {
        return isset($this->array[$this->position]);
    }
}

繰り返しますが、基本的に同じ方法でトラバースできます。

$it = new myIterator;

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

では、なぜ 2 つのインターフェイスが必要なのか、またそれらの違いは何なのか、説明できる人はいますか?

4

7 に答える 7

24

IteratorAggregate時間を節約したい場合やIterator、オブジェクトの繰り返しを細かく制御する必要がある場合を想定しています。たとえば、カスタム例外を追加したり、next()失敗したり、キャッシュ (ネットワーク経由でデータを取得するものを反復処理する場合) を追加したり、値を返す前に前処理したりできます。key()prev()

于 2012-11-29T11:32:07.507 に答える
7

それらの違いは何ですか?

名前の違い(「集合体」)。

Aggregate とはどういう意味ですか?

集約状態は、外部オブジェクトがそのメンバーへの参照を保持することを禁止することにより、集約内で行われる変更の一貫性を保証します。 (ウィキペディア)


TC コード:

class myData implements IteratorAggregate {//your implementation}

class myIterator implements Iterator {//your implementation}

Aggregate をわかりやすくするためのコードを次に示します。

$renderFunction = function($iterator) {
    foreach($iterator as $key => $value) {
        echo "$key: $value\n";
        foreach($iterator as $key => $value) {
           echo "    $key: $value\n";
        }
    }
};

$renderFunction(new myData); // Aggregate on
$renderFunction(new myIterator); // Aggregate off

ケースに何を期待しますか?

https://3v4l.org/JHDNQ

property1: Public property one
    property1: Public property one
    property2: Public property two
    property3: Public property three
    property4: last property
property2: Public property two
    property1: Public property one
    property2: Public property two
    property3: Public property three
    property4: last property
property3: Public property three
    property1: Public property one
    property2: Public property two
    property3: Public property three
    property4: last property
property4: last property
    property1: Public property one
    property2: Public property two
    property3: Public property three
    property4: last property

0: one
    0: one
    1: two
    2: three
于 2016-11-17T09:37:15.473 に答える
6

を実装することで、イテレータ関数( , , , , )を実装する仕事を他のクラスIteratorAggregateに委任します( .key()next()current()valid()rewind()getIterator()

このようにして、OOP で個別の懸念を達成するのに役立ちます。

于 2016-12-27T14:04:53.767 に答える