PHP 5.6生成器语法:生成器只能在foreach循环中使用吗?

问题描述 投票:4回答:2

我知道不用生成器就可以很容易地对其进行归档,但是我想更好地理解生成器。因此,请不要建议使用其他东西。


我有一个为屏幕快照(硒)生成文件名的类:

class ScreenshotName
{

    private $counter = 0;

    public function screenshotNameIterator()
    {
         while(true) {
            yield sprintf("screenshot-%s-%s.png", date("Y-m-d\\TH:i:s"), ++$this->counter);
        }
    }
}

现在,我的问题是:除了foreach循环之外,是否可以在其他任何上下文中使用这样的生成器?例如

(new ScreenshotName())->screenshotNameIterator()->next()

对我来说,这总是返回null,如果我调试,它永远不会进入generator方法。 PHP文档也没有真正提到这一点。

所以我的问题是:有没有一种书面方法可以在不同于for循环的上下文中使用生成器?

php generator
2个回答
2
投票

有记录的方法可以做到这一点。实际上,正如您在page上看到的那样,Generator确实实现了迭代器接口。

实际上foreach关键字仅在迭代器上有效。因此,如果可以在生成器上使用foreach,则必须能够调用next

这里是使用next而不是foreach的示例代码:

<?php

function evenNumbers() {
    for ($i = 0;; $i++) {
        yield 2*$i;
    }
}

$gen = evenNumbers();
$gen->next();
echo $gen->current();

?>

0
投票

这里是Dark Duck's answer附带的完整代码段。也就是说,它演示了如何使用Iterator接口迭代所有值。 (Dark Duck的代码不完整。)基于a comment by robert_e_lee on Iterator doc

© www.soinside.com 2019 - 2024. All rights reserved.