アイテムのコレクションを格納するオブジェクトを考えてください。ただし、コレクションは事前定義されたコンテキストによって異なる場合があります。オブジェクトの状態/内容を適切に変更するイテレータの使用法(php)
Class Container implements IteratorAggregate (
protected $contexts; // list of associated contexts, example: array(0=>1,1=>3)
protected $contents; // array
public loadContents($contextId) { /* populates $this->contents*/ }
public getContexts() { /* populates $this->contexts */ }
...
public function getIterator() { return new ArrayIterator($this->contents); }
public getContextIterator() { return new contextIterator($this); }
}
イテレータは次のようになります。各コンテキストは反復的に検討する必要がありますいくつかの例について
Class contextIterator {
protected $container;
protected $contexts;
protected $currentContext;
public function __construct($container) {
$this->container = $container;
$this->contexts = $container->getContexts();
$this->currentContext = 0;
}
public current() {
$this->container->loadContents($this->key());
return $this->contexts[ $this->key() ];
}
public function key() { return $this->currentContext; }
public function next() { $this->currentContext++; }
public function rewind() { $this->currentContext = 0; }
public function valid() { return isset($this->contexts[ $this->key() ]); }
}
、私は次のようにします。
$myContainer = new Container();
foreach($myContainer->getContextIterator() as $key => $value) {
$myContainer->someMethod();
}
を上記のは素晴らしいとコンパクトですしかし、実際に$ keyや$ valueを使用していることはないので、私にとっては汚いと感じています。イテレータのオーバーキルを使用していますか?さらに、イテレータがオブジェクトの状態/内容を変更した場合、それは反復処理されますか?
'return $ this-> steps [$ this-> key()];' 'steps'はどこに宣言されていますか?フルコードで答えるのがより簡単になります。 –
おっと、申し訳ありません。プロパティ「ステップ」は「コンテキスト」であったはずです。私は私の質問を編集しました。まだ詳しい情報が必要ですか? – jbarreiros
私はあなたがここで達成しようとしているものを実際には得られません。これはあなたが他の言語でやっていたことですか?私はここに私の無知で嘆きに行くより多くの経験豊富なプログラマーがいると確信しているので、これを尋ねなければならないために愚かな気がする。 – pthurmond