似乎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。
有谁知道为什么会这样,以及如何解决它在生成器中复制静态变量?
答案 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++;
}
但同样,这太奇怪了。