我有一个实现ArrayAccess,Iterator和Countable的对象。这产生了一个非常完美的阵列掩蔽。我可以使用偏移量($object[foo]
)来访问它,我可以将它放入foreach
- 循环以及许多其他内容。
但我不能做的就是将它提供给本机数组迭代器函数(next()
,reset()
,current()
,key()
),即使我已经实现了Iterator所需的方法。 PHP似乎顽固地试图遍历其成员变量,并完全忽略迭代器方法。
是否有一个接口可以将对象挂钩到剩余的数组遍历函数,还是我坚持使用我的内容?
更新: IteratorAggregate似乎也不是答案。虽然它在foreach
- 循环中使用,但基本数组迭代器函数不会调用方法。
答案 0 :(得分:5)
PHP的最新更改阻止使用标准数组函数(重置,下一步等)操纵ArrayIterators表单。
答案 1 :(得分:3)
使其工作的一种方法是在单独的类中定义自己的迭代器,然后告诉主类使用新的迭代器而不是默认的迭代器。
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。)
上述情况没有进行测试,但原则是正确的,我相信。
希望这有帮助!
答案 2 :(得分:0)
ArrayIterator不是您要找的吗?或者ArrayObject怎么样,这似乎是SPL与你想要实现的目标的接口。