似乎 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++;
}
但同样,这太奇怪了。