题
我有一个对象,实现了 ArrayAccess, 迭代 和 可数.生产的几乎完美的列掩蔽。我可以访问有抵消($object[foo]
),我可以把它扔到一个 foreach
-循环,和许多其他的事情。
但是什么我不能做的就是给它的阵地迭代的职能(next()
, reset()
, current()
, key()
),即使我们实现所需要的方法从迭代器。PHP似乎顽固地试图迭代过其成员的变量,并且完全无视的迭代方法.
是有一个接口,将钩的对象的其余阵列-穿功能,还是我坚持与我有什么?
更新: IteratorAggregate似乎并不是答案。虽然这是用在 foreach
-循环,基本阵列迭代的功能不调的方法。
解决方案
最近在PHP变化防止ArrayIterators形式被使用标准数组函数(复位,下,等等)。
操纵其他提示
要得到这个工作的一种方法是定义在一个单独的类你自己的迭代,然后告诉你的主类,而不是使用默认的一个新的迭代器。
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)。
没有测试以上进行,但原理是正确的,我相信。
希望这有助于!
时 ArrayIterator 不是你要找什么对于?或约 ArrayObject的,这似乎是SPL的接口是什么为你想达到的目标。
不隶属于 StackOverflow