1

我有一个实现ArrayAccessIteratorCountable的对象。这会产生近乎完美的阵列掩蔽。$object[foo]我可以使用偏移量foreach

但是我不能做的是把它交给本机数组迭代器函数(next(), reset(), current(), key()),即使我已经从 Iterator 实现了所需的方法。PHP 似乎顽固地尝试遍历其成员变量,并且完全无视迭代器方法。

是否有一个接口可以将对象连接到剩余的数组遍历函数,或者我是否坚持我所拥有的?

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

4

3 回答 3

5

PHP 的最新变化阻止了使用标准数组函数(reset、next 等)操作 ArrayIterators 表单。

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

于 2008-11-24T21:55:49.367 回答
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)。

上面没有做过测试,但原理是正确的,我相信。

希望这可以帮助!

于 2008-11-24T21:36:32.183 回答
0

ArrayIterator不是您要找的吗或者ArrayObject怎么样,这似乎是您想要实现的 SPL 接口。

于 2008-11-24T21:25:44.967 回答