質問
ArrayAccess を実装するオブジェクトがあります。 イテレーターおよび Countable 。これにより、ほぼ完全な配列マスキングが生成されます。オフセット( $ object [foo]
)でアクセスできます。 < code> foreach -loop、および他の多くのもの。
しかし、私ができないのは、ネイティブ配列のイテレータ関数( next()
、 reset()
、 current()、
key()
)。 PHPは頑固にそのメンバー変数を反復処理しようとするようであり、イテレータメソッドを完全に無視します。
オブジェクトを残りの配列横断関数にフックするインターフェースがありますか、それとも私が持っているものにこだわっていますか?
更新: IteratorAggregateも答えではないようです。 foreach
ループで使用されますが、基本的な配列イテレータ関数はメソッドを呼び出しません。
解決
PHPの最近の変更により、標準の配列関数(reset、nextなど)を使用してArrayIteratorsフォームを操作できなくなりました。
これはすぐに復元する必要があります。 http://news.php.net/php.internals/42015
他のヒント
これを機能させる1つの方法は、独自のイテレータを別のクラスで定義し、メインクラスにデフォルトのイテレータの代わりにその新しいイテレータを使用するように指示することです。
class MyIterator implements Iterator {
public function key() {
//
}
public function rewind() {
//
}
// etc.
}
class MyMainClass implements IteratorAggregate {
private これを機能させる1つの方法は、独自のイテレータを別のクラスで定義し、メインクラスにデフォルトのイテレータの代わりにその新しいイテレータを使用するように指示することです。
<*>
その後、必要なだけ制御する必要があります。 (そして、多くのクラスで独自のMyIteratorを再利用できます。)
上記のテストは行われていませんが、原理は正しいと思います。
これがお役に立てば幸いです!
data = array();
// getIterator is required for the IteratorAggregate interface.
public function getIterator() {
return new MyIterator($this->_data);
}
// etc.
}
その後、必要なだけ制御する必要があります。 (そして、多くのクラスで独自のMyIteratorを再利用できます。)
上記のテストは行われていませんが、原理は正しいと思います。
これがお役に立てば幸いです!
ArrayIterator は見ているものではありませんにとって?または、 ArrayObject はどうですか。これはSPLのインターフェースのようですあなたが達成しようとしていることに対して。