静态关键字在 PHP 生成器函数中不起作用


Static keyword doesn't work inside PHP generator function

似乎 static 关键字在生成器函数中不起作用?在 PHP 5.5 中:

function static_fn () {
    static $p = 0;
    echo "'nstatic_fn: p = " . $p . "'n" ;
    $p++;
}
echo "calling static_fn()'n";
static_fn();
echo "calling static_fn()'n";
static_fn();
function static_gen() {
    static $p = 0;
    echo "'nstatic_gen: p = " . $p . "'n" ;
    yield $p;
}
echo "calling static_gen()'n";
foreach(static_gen() as $stuff) {
    echo $stuff . "'n";
}
echo "calling static_gen()'n";
foreach(static_gen() as $stuff) {
    echo $stuff . "'n";
}

我得到结果

calling static_fn()
static_fn: p = 0
calling static_fn()
static_fn: p = 1
calling static_gen()
static_gen: p = 0
0
calling static_gen()
static_gen: p = 0
0

也就是说,static 关键字成功地适用于从连续调用返回 0 和 1 的 static_fn 函数,但它不适用于在每次调用中将其重新初始化为 0 的static_gen函数。

有谁知道为什么会这样,以及如何解决它以在生成器中复制静态变量?

试试这个:

function static_gen() {
    static $p = 0; #initialised
    while ($p < 10) { #yield while $p is smaller than 10
      $p++; #increased
      echo "'nstatic_gen: p = " . $p . "'n" ;
      yield $p; #yield value 
    }
} 

那会起作用。

旁注:只要给定值,生成器函数就必须产生值。因此,函数必须以一种或另一种方式提供它。

就像@JustOnUnderMillions上面评论的那样,静态变量不会在函数之间共享。

静态变量具有每个函数的作用域。此外,生成器的目的不是做你已经做过的事情(好吧,也许你只是在测试一些:)的东西)。

无论如何,您可以将static_gen()更改为:

function static_gen()
{
    static $p = 0;
    echo "'nstatic_gen: p = " . $p . "'n";
    yield $p++;
}

但同样,这太奇怪了。