是否有使用生成器作为迭代器的接口?

时间:2013-02-23 15:35:35

标签: php class iterator generator

我想创建一个目录类,我想让它作为迭代器(foreach-able)运行。 但我希望它是基于生成器的(例如一个“屈服”的函数)。 有可能吗?

2 个答案:

答案 0 :(得分:4)

没有明确的类接口来实现生成器,但是你可以在这里使用IteratorAggregate

请参阅Generators RFC

中实施IteratorAggregate的示例
class Test implements IteratorAggregate {
    protected $data;

    public function __construct(array $data) {
        $this->data = $data;
    }

    public function getIterator() {
        foreach ($this->data as $key => $value) {
            yield $key => $value;
        }
        // or whatever other traversation logic the class has
    }
}

$test = new Test(['foo' => 'bar', 'bar' => 'foo']);
foreach ($test as $k => $v) {
    echo $k, ' => ', $v, "\n";
}

答案 1 :(得分:0)

生成器迭代器。

来自http://www.php.net/manual/en/language.generators.object.php

  

第一次调用生成器函数时,将返回内部Generator类的对象。该对象实现Iterator接口的方式与只转发迭代器对象的方式非常相似。