2017-04-24 22 views
3

PHP 7.1では、配列を抽象化する新しい psudoタイプとTraversableオブジェクトがあります。PHP - ジェネリックな繰り返し可能性を2回繰り返します。

は私のコードでは、私は次のようなクラスがあるとします。

class Foo 
{ 
    private $iterable; 

    public function __construct(iterable $iterable) 
    { 
     $this->iterable = $iterable; 
    } 

    public function firstMethod() 
    { 
     foreach ($this->iterable as $item) {...} 
    } 

    public function secondMethod() 
    { 
     foreach ($this->iterable as $item) {...} 
    } 
} 

これは正常に動作$iterableある$iterableGeneratorある場合を除き、配列またはIteratorです。その場合、実際にはfirstMethod()を呼び出してからsecondMethod()を呼び出すと、Exception: Cannot traverse an already closed generatorが生成されます。

この問題を回避する方法はありますか?

答えて

2

発電機は巻き戻しできません。この問題を回避するには、新しい発電機を作る必要があります。あなたがのIteratorAggregateを実装するオブジェクトを作成する場合、これは自動的に行うことができます。

class Iter implements IteratorAggregate 
{ 
    public function getIterator() 
    { 
     foreach ([1, 2, 3, 4, 5] as $i) { 
      yield $i; 
     } 
    } 
} 

それからちょうどあなたのイテレータとしてこのオブジェクトのインスタンスを渡します

$iter = new Iter(); 
$foo = new Foo($iter); 
$foo->firstMethod(); 
$foo->secondMethod(); 

出力:

1 
2 
3 
4 
5 
1 
2 
3 
4 
5