PHP对象作为虚拟数组

时间:2008-11-24 21:14:52

标签: php arrays spl

我有一个实现ArrayAccessIteratorCountable的对象。这产生了一个非常完美的阵列掩蔽。我可以使用偏移量($object[foo])来访问它,我可以将它放入foreach - 循环以及许多其他内容。

但我不能做的就是将它提供给本机数组迭代器函数(next()reset()current()key()),即使我已经实现了Iterator所需的方法。 PHP似乎顽固地试图遍历其成员变量,并完全忽略迭代器方法。

是否有一个接口可以将对象挂钩到剩余的数组遍历函数,还是我坚持使用我的内容?

更新: IteratorAggregate似乎也不是答案。虽然它在foreach - 循环中使用,但基本数组迭代器函数不会调用方法。

3 个答案:

答案 0 :(得分:5)

PHP的最新更改阻止使用标准数组函数(重置,下一步等)操纵ArrayIterators表单。

这应该很快恢复: http://news.php.net/php.internals/42015

答案 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与你想要实现的目标的接口。