当前位置: 首页 > 知识库问答 >
问题:

PHP5.6生成器语法:生成器只能在foreach循环中使用吗?

钮鸿煊
2023-03-14

我知道这在没有生成器的情况下是非常容易归档的,但是我想更好地理解生成器。因此,请不要建议使用其他东西。

我有一个类可以为屏幕截图生成文件名(selenium):

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,如果我调试,它永远不会进入生成器方法。PHP文档也没有真正提到这一点。

所以我的问题是:有没有一种记录在案的方法在不同的上下文中使用生成器而不是for循环?

共有2个答案

尉迟鸿熙
2023-03-14

这是一个完整的代码片段,与黑暗鸭子的答案相匹配。也就是说,它演示了如何使用迭代器接口迭代所有值。(黑暗鸭子的代码不完整。)基于robert_e_lee在Iterator doc上的评论:

$gen = evenNumbers();
// If in a method that re-uses an iterator, may want the next line.
//OPTIONAL $gen->rewind();
while ($gen->valid()) {
    // This is the value:
    $value = $it->current();
    // You might or might not care about the key:
    //OPTIONAL $key = $it->key();

    // ... use $value and/or $key ...

    $it->next();
}

上述情况大致相当于:

foreach (evenNumbers() as $value) {
    // ... use $value ...
}

或者

foreach (evenNumbers() as $key => $value) {
    // ... use $value and/or $key ...
}
隆安然
2023-03-14

有一种记录在案的方法可以做到这一点。事实上,生成器确实实现了迭代器接口,正如您在本页上看到的那样。

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

下面是使用next而不是foreach的示例代码:

<?php

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

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

?>
 类似资料:
  • 我知道这在没有生成器的情况下是非常容易归档的,但是我想更好地理解生成器。因此,请不要建议使用其他东西。 我有一个类可以为屏幕截图生成文件名(selenium): 现在我的问题是:除了Foreach循环之外,我可以在任何其他上下文中使用这样的生成器吗?例如。 对我来说,这总是返回null,如果我调试,它永远不会进入生成器方法。PHP文档也没有真正提到这一点。 所以我的问题是:有没有一种记录在案的方法

  • 问题内容: 所以我有一个生成器函数,看起来像这样。 在加载此函数并多次调用“ next”之后,我希望它会产生值 但是相反,它总是一直产生0。这是为什么? 问题答案: 初始化新的生成器对象: 然后从新创建的生成器对象获取第一个值(在您的情况下为 0 )。 您应该致电一次: 注意 :已从Python 3(PEP 3114)中删除- 改为使用该函数:

  • 这个脚本应该以随机生成的延迟滚动浏览网站上的每个容器。对于循环中的每次迭代,我要将ms的“暂停”替换为一个在和秒之间随机生成的数字。 随机数生成器: 就像这样工作很好。在每次迭代之后,会有2秒的暂停。但是,当我移除注释以添加行以随机化每次迭代之间的时间时,值(它应该滚动到哪个容器)一开始很好,但后来也变成随机的。 控制台输出: 我该怎么解决这个?

  • 我不是只想用第一个数字来完成这个操作,而是使用while循环和if条件,使我在键盘上输入的任何内容都变成一个整数。 你觉得问题出在哪里?请帮帮我.

  • 问题内容: 我需要一个2D循环,其中第一个循环使用迭代器,第二个循环使用生成器,但是此简单函数无法正常工作,有人可以帮助检查吗? 不知道为什么?在此先感谢您的帮助。 问题答案: 既然您要澄清一下,我再说一遍。但实际上Ignacio的答案很好地总结了这一点:您只能在一个生成器上进行一次迭代。您示例中的代码尝试对其进行3次迭代,对于中的每个值一次。 要了解我的意思,请考虑以下简单示例: 当被调用时,它

  • 我正在Flask中构建一个web应用程序,它涉及到一些SQLAlchemy。我有一个函数“get_team()”让我发疯。 我一直得到的错误:"属性错误:'Unicode'对象没有属性'_sa_instance_state'"。以下是模型的样子: 任何方向都将不胜感激!