5

私は何が何でgetIterator()あるかを理解しようとしています、私は説明します:

私が知ってgetIteratorいるように、外部 Iterator を含めるために呼び出すメソッドです。

問題は、getIterator に独自のメソッドが含まれていることです。閉じると同じように見えますが、Iterator インターフェイスですが、インターフェイスにすることはできません。クラスにすることはできますが、SPL.php ソース コード内で検索しようとしていますが、何も見つかりませんでした。多分私はこれを実際よりも複雑にしています.誰かがSPL.phpソースコードのどこにあるのか、それが何であるか(クラスなど)を理解するのを手伝ってくれると嬉しいです. 良い一日をお過ごしください。

4

1 に答える 1

13

ArrayObjectこれにより、イテレータを実装IteratorAggregateする代わりに返すことができます。それはかなり簡単です。次のように、配列をラップするクラスがあるとします。

class Foo
{
    private $array = [1,2,3,4];
}

foreachそして、次のように のインスタンスをオーバーしたいFoo:

foreach (new Foo as $bar) {
    echo $bar; // outputs 1234
}

これを実現するには、インターフェイスを追加できIteratorますが、オブジェクト内の配列を反復処理するという単純なタスクのために、すべてのメソッドをインターフェイスに実装する必要がありました。その機能が必要なときはいつでも、そのコードを何度も複製したくはありません。特に、必要なことを行う Iterator が既に存在するためです。したがって、実装する代わりに実装しIteratorますIteratorAggregate

class Foo implements IteratorAggregate
{
    private $array = [1,2,3,4];

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

これで、 PHP はインスタンス自体の代わりにforeach返された Iterator を使用して、出力 1234 を取得できるようになります。getIteratorFoo

の場合、ポイントは単純にの値をオーバーArrayObjectできるようにするためです。もちろん、パブリックであるため、自分自身を呼び出して、返された Iterator を直接使用することもできます。foreachArrayObjectgetIterator

の ctor 署名にも注意してくださいArrayObject

public __construct (
    [ mixed $input 
    [, int $flags = 0 
    [, string $iterator_class = "ArrayIterator" 
]]] )

どの Iterator が返されるかを示します。

于 2012-07-07T08:12:45.710 に答える