静态关键字在PHP生成器函数

时间:2016-07-12 12:29:09

标签: php function static generator

似乎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关键字成功地用于static_fn函数,该函数从连续调用返回0和1,但它不适用于static_gen函数,它被重新初始化为每次通话都是0。

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

2 个答案:

答案 0 :(得分:2)

试试这个:

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 
    }
} 

这将有效。

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

答案 1 :(得分:1)

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

静态变量具有每个函数的范围。 而且,生成器并不是为了做你已经做过的事情(好吧,也许你只是在测试一些东西:))。

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

function static_gen()
{
    static $p = 0;

    echo "\nstatic_gen: p = " . $p . "\n";

    yield $p++;
}

但同样,这太奇怪了。