1

ArrayAccessIteratorCountableを実装するオブジェクトがあります。これにより、ほぼ完全なアレイマスキングが生成されます。$object[foo]オフセット( )でアクセスしたり、ループに入れforeachたり、その他多くのことを行うことができます。

しかし、Iteratorから必要なメソッドを実装したとしても、ネイティブの配列イテレーター関数(、、、、)にそれnext()を与えることはできません。PHPは、そのメンバー変数を頑固に反復しようとしているようであり、iterator-methodsを完全に無視しています。reset()current()key()

オブジェクトを残りの配列トラバース関数にフックするインターフェイスはありますか、それとも私が持っているものに固執していますか?

更新: IteratorAggregateも答えではないようです。-loopsで使用されforeachますが、基本的な配列イテレータ関数はメソッドを呼び出しません。

4

3 に答える 3

5

PHP の最近の変更により、ArrayIterators フォームが標準の配列関数 (reset、next など) を使用して操作されなくなりました。

これはすぐに復元されるはずです: http://news.php.net/php.internals/42015

于 2008-11-24T21:55:49.367 に答える
3

これを機能させる 1 つの方法は、別のクラスで独自の反復子を定義し、メイン クラスにデフォルトの反復子の代わりにその新しい反復子を使用するように指示することです。

class MyIterator implements Iterator {
  public function key() {
    //
  }

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private $_data = array();

  // getIterator is required for the IteratorAggregate interface.
  public function getIterator() {
    return new MyIterator($this->_data);
  }

  // etc.

}

次に、必要なだけ制御できるようにする必要があります。(そして、多くのクラスで独自の MyIterator を再利用できます)。

上記のテストは行われていませんが、原則は正しいと思います。

お役に立てれば!

于 2008-11-24T21:36:32.183 に答える
0

ArrayIteratorはあなたが探しているものではありませんかまたは、ArrayObjectについてはどうでしょうか。これは、達成しようとしていることに対するSPLのインターフェースのようです。

于 2008-11-24T21:25:44.967 に答える