【问题标题】:PHP Yield keyword - loop iterationPHP Yield 关键字 - 循环迭代
【发布时间】:2014-10-13 14:05:02
【问题描述】:

我正在使用 PHP 生成器,无法解释这种行为。 这是我试过的代码

<!-- language: PHP -->
<?php
function myfun($num1, $num2, $ctr = 1) {
    for ($i = $num1; $i <= $num2; $i =+ $ctr) {
        yield $i;
    }
}
echo 'Odd numbers: ';
foreach(myfun(1, 7, 2) as $num) {echo $num;};
?>

有人可以使用 PHP yield 来解释我的这种行为,进入无限循环吗?

结果:奇数:122222222222222222222222222222222......

注意:$i += $ctr 按预期工作

结果:奇数:1357

【问题讨论】:

  • $i =+ $ctr$i = $ctr 相同。 + some number 本质上是一个空操作。

标签: php generator yield post-increment


【解决方案1】:

问题在于=+ 操作,您可能想输入+=,这样就可以解决问题:

<?php
function myfun($num1, $num2, $ctr = 1) {
    for ($i = $num1; $i <= $num2; $i += $ctr) {
        yield $i;
    }
}
echo 'Odd numbers: ';
foreach(myfun(1, 7, 2) as $num) {echo $num;};

结果:Odd numbers: 1357

【讨论】:

  • 我同意这一点,但为什么是 1222222,而不是 1111111??
  • 您在第一次迭代中将$i 分配为$num1,并使用1 作为$num1 的值调用它
  • 1 为未提供时的默认值;去掉循环定义中的 =1 (so function myfun($num1, $num2, $ctr)),同样的行为!!!
  • 在第一次迭代中$i 等于$num1,这是for() 的第一部分。在第二次迭代中(以及 all 其他),它将被设置为 $ctr(即 2)。所以你会得到一个循环$i1,而接下来的所有循环都是2。循环没有结束,因为$i &lt;= $num2 永远不会是真的。
【解决方案2】:
$i =+ $ctr

=+ 不是运算符。这基本上可以做到$i = $ctr

第一次发生循环时,$i 设置为 $ctr,在本例中为 2。在此之后,它一直设置为 2,并且永远不会更高。因此无限循环。请改用+=

【讨论】:

  • @Jean-ChristopheVerhulst 不要责怪解析器。这里没什么可抱怨的——无限循环是一个有效的语法结构。这里+符号被解释为unary plus operator,即$x = 10$x = +10在语义上是等价的。解析器无法知道您不是一元加号运算符而是要编写复合赋值运算符。所以...
猜你喜欢
  • 2015-02-21
  • 2015-12-17
  • 2016-05-24
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
相关资源
最近更新 更多