【问题标题】:Static keyword doesn't work inside PHP generator function静态关键字在 PHP 生成器函数中不起作用
【发布时间】:2016-07-12 12:29:09
【问题描述】:

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,但它不适用于在每次调用中重新初始化为 0 的 static_gen 函数。

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

【问题讨论】:

  • static $p 对于每个函数都是唯一的,请记住这一点!
  • 你最好使用全局变量或将你的函数包装到类中
  • where it was reinitialised to 0 in each call 但你也没有对static_gen 中的变量做任何事情!你期待什么?
  • 哈哈,我真是个白痴。你当然是对的。这是一个绝对可耻的错误,错过了。你想发布这个问题的答案,以便我标记你是正确的。

标签: php function static generator


【解决方案1】:

试试这个:

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

这会起作用的。

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

【讨论】:

  • 为什么 OP 应该尝试这个?一个好的答案总是会解释所做的事情以及为什么以这种方式完成,不仅对 OP,而且对 SO 的未来访问者。
【解决方案2】:

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

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

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

function static_gen()
{
    static $p = 0;

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

    yield $p++;
}

但又一次,这太奇怪了。

【讨论】:

  • 不要让它成为示例代码。这直接进入了一个无限循环!
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2011-01-16
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多