2016-07-12 16 views
4

Es scheint, dass das Schlüsselwort static nicht in Generatorfunktionen funktioniert? In PHP 5.5:Statisches Schlüsselwort funktioniert nicht in PHP-Generatorfunktion

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

ich das Ergebnis

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 

Das heißt, das static Schlüsselwort erfolgreich für die static_fn Funktion gearbeitet, die von aufeinanderfolgenden Anrufen 0 und 1 zurück, aber es hat nicht funktioniert für die static_gen Funktion, wo es bei jedem Aufruf auf 0 neu initialisiert wurde.

Weiß jemand, warum das so ist, und wie man es umgehen könnte, um statische Variablen in einem Generator zu replizieren?

+0

'static $ p' ist einzigartig für jede Funktion, behalte das im Hinterkopf! – JustOnUnderMillions

+0

verwenden Sie besser globale var oder wickeln Sie Ihre Funktionen in Klasse –

+2

', wo es bei jedem Aufruf neu initialisiert wurde auf 0, aber Sie haben auch nichts mit der Variablen innerhalb' static_gen' getan! Was erwartest du? – JustOnUnderMillions

Antwort

2

Versuchen Sie folgendes:

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

, die funktioniert.

Hinweis: Eine Generatorfunktion muss solange Werte liefern, wie Werte angegeben sind. Also muss die Funktion es auf die eine oder andere Art bereitstellen.

+2

Warum sollte das OP dies versuchen? Eine gute Antwort wird immer eine Erklärung haben, was getan wurde und warum es so gemacht wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO. – Rizier123

1

Genau wie @JustOnUnderMillions oben kommentiert, statische vars werden nicht unter den Funktionen geteilt.

Statische Variablen haben Gültigkeitsbereich pro Funktion. Darüber hinaus ist Generatoren nicht darauf ausgerichtet, das zu tun, was Sie getan haben (okay, vielleicht testen Sie gerade etwas :)).

Auf jeden Fall konnte man Sie static_gen() ändern:

function static_gen() 
{ 
    static $p = 0; 

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

    yield $p++; 
} 

Aber noch einmal, es ist so seltsam ist.

+1

Lassen Sie dies nicht ein Beispiel-Code sein. Das geht direkt in eine Endlosschleife! – JustOnUnderMillions