2016-07-12 11 views
4

staticキーワードがジェネレータ関数内で機能しないようですか? PHP 5.5では :PHPジェネレータ関数内で静的キーワードが機能しない

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

私は、staticキーワードが連続呼び出しから0と1を返しstatic_fn機能のために成功裏に働いているが、それはのために働かなかった結果

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_gen関数では、各呼び出しで0に再初期化されました。

これはなぜそうであり、ジェネレータの静的変数を複製するためにそれを回避する方法を知っていますか?

+0

'static $ p'は関数ごとにユニークですので、覚えておいてください! – JustOnUnderMillions

+0

グローバル変数を使うか、関数をクラス –

+2

にラップして '各呼び出しで0に再初期化されましたが、' static_gen'の中で変数を使って何もしないでください!あなたは何を期待していますか? – JustOnUnderMillions

答えて

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

動作すること。

サイドノート:ジェネレータ関数は、値が与えられている限り値を生成する必要があります。したがって、関数はそれを他の方法で提供する必要があります。

+2

なぜOPはこれを試すべきですか?良い答えは、何が行われたのか、なぜそれがOPのためだけでなく、将来の訪問者のために、そうした方法で行われたのかについての説明を常に持つでしょう。 – Rizier123

1

@ JustOnUnderMillionsのようにコメントしたのと同じように、静的変数は関数間で共有されません。

静的変数には、関数ごとに有効範囲があります。 さらに、ジェネレータはあなたがしたことを行うことを目的としていません(大丈夫ですか?

はとにかく、あなたは変わる可能性があります static_gen()へ:

function static_gen() 
{ 
    static $p = 0; 

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

    yield $p++; 
} 

しかし、再び、それはとても奇妙であるのです。

+1

これを例コードにしてはいけません。これは無限ループに直進します! – JustOnUnderMillions

関連する問題