web-dev-qa-db-de.com

PHP Statische Variablen

$count = 5;
function get_count()
{
    static $count = 0;
    return $count++;
}
echo $count;
++$count;
echo get_count();
echo get_count();

Ich habe gedacht, es gibt 5 0 1 und es ist richtig, aber ich brauche eine bessere Erklärung?

40
omg

Die Variable $count in der Funktion hängt in keiner Weise mit der globalen $count-Variablen zusammen. Das Schlüsselwort static ist dasselbe wie in C oder Java. Dies bedeutet: Initialisieren Sie diese Variable nur einmal und behalten Sie ihren Status, wenn die Funktion endet. Das bedeutet, wenn die Ausführung erneut in die Funktion eintritt, wird der innere $ count bereits initialisiert und beim letzten Mal als 1 gespeichert und verwendet diesen Wert.

70
soulmerge
$count = 5; // "outer" count = 5

function get_count()
{
    static $count = 0; // "inner" count = 0 only the first run
    return $count++; // "inner" count + 1
}

echo $count; // "outer" count is still 5 
++$count; // "outer" count is now 6 (but you never echoed it)

echo get_count(); // "inner" count is now + 1 = 1 (0 before the echo)
echo get_count(); // "inner" count is now + 1 = 2 (1 before the echo)
echo get_count(); // "inner" count is now + 1 = 3 (2 before the echo)

Ich hoffe das klärt deinen Verstand.

41
Alix Axel

Sie haben zwei separate Variablen, die beide als $ count bezeichnet werden, aber sie haben einen anderen scope . Die erste Variable wird nicht explizit deklariert, sondern tritt bei der ersten Zuweisung auf.

Die zweite Variable (innerhalb der Methode) ist nur für diese Methode sichtbar. Da es static ist, bleibt sein Wert zwischen mehreren Ausführungen derselben Methode erhalten. Die Zuweisung $count = 0; wird nur bei der ersten Ausführung der Methode ausgeführt.

Was den Inkrementoperator (++) betrifft, ist das Ergebnis der Auswertung der Wert vor, um den es inkrementiert wurde, da der Operator ( unary ) hinter dem Variablennamen steht. Ja, die Ausgabe wäre 5, 0, 1.
Wenn Sie return ++$count; schreiben würden, wäre das Ergebnis 5, 1, 2 gewesen.

Hinweis: Der ++$count, den Sie in Ihrem vorhandenen Code haben, entspricht $count++, da das Ergebnis der Auswertung verworfen wird. Der Effekt auf die Variable $count ist derselbe: Sie wird um 1 erhöht.

13
Thorarin

Erstes Echo: Gibt die Variable $ count an, die Sie in Ihrer ersten Zeile deklarieren.

Zweites Echo: ruft get_count auf, wodurch die statische Variable $ count erstellt wird (also im Kontext dieser Funktion). Wenn Sie die statische Variable instanziieren, setzen Sie sie auf Null. return $ count ++ ist eine der Zeilen, die wir normalerweise im Code vermeiden - im Wesentlichen wird sie jedoch erhöht, sobald der Wert zurückgegeben wird.

Drittes Echo: Ebenso wurde 0 nach dem vorherigen Aufruf von get_count auf 1 erhöht. Das Gleiche geschieht hier - es gibt 1 zurück und erhöht den Wert auf 2.

Hilft das oder ist das eigentlich verwirrender?

5
Fenton

Nun, zuallererst sind $ count in der Funktion und $ count außerhalb der Funktion zwei verschiedene Variablen. Das erklärt, warum bei der ersten Ausgabe 5 gedruckt wird.

Nun zum statischen: Statisch bedeutet, dass Ihre lokale Variable nur einmal erstellt wird, wenn die Funktion zum ersten Mal ausgeführt wird. Jede Funktionsausführung verwendet danach dieselbe Variable, sodass die neuesten Werte der Variablen in der letzten Funktionsausführung noch vorhanden sind.

Beim ersten Aufruf von get_count () wird die Variable also auf 0 gesetzt und dann zurückgegeben. Nach der Rückkehr wird die Variable inkrementiert.

Wenn Sie die Funktion zum zweiten Mal aufrufen, ist die Variable immer noch 1. Dieser Wert wird zurückgegeben und dann auf 2 erhöht.

0

PHP hat ein bekanntes static-Schlüsselwort, das in objektorientierten PHP zum Definieren statischer Methoden und Eigenschaften weit verbreitet ist. Es sollte jedoch beachtet werden, dass static auch in Funktionen zur Definition statischer Variablen verwendet werden kann.

Was ist 'statische Variable'?

Die statische Variable unterscheidet sich von der normalen im Funktionsbereich definierten Variablen, wenn sie nicht an Wert verliert, wenn die Programmausführung diesen Bereich verlässt. Betrachten wir das folgende Beispiel für die Verwendung statischer Variablen:

function countSheep($num) {
 static $counter = 0;
 $counter += $num;
 echo "$counter sheep jumped over fence";
}

countSheep(1);
countSheep(2);
countSheep(3);

Ergebnis:

1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence

Wenn wir $counter ohne static definiert hätten, wäre jedes Mal, wenn ein Echo-Wert vorliegt, der $num-Parameter, der an die Funktion übergeben wird. Mit static können Sie diesen einfachen Zähler ohne zusätzliche Umgehung erstellen.

Anwendungsfälle statischer Variablen

  1. Um Werte zwischen aufeinanderfolgenden Funktionsaufrufen zu speichern.
  2. Speichern von Werten zwischen rekursiven Aufrufen, wenn keine Möglichkeit besteht (oder kein Zweck __.), Um sie als Parameter zu übergeben.
  3. Wert speichern, der normalerweise besser einmal abgerufen werden kann. Zum Beispiel Ergebnis des Lesens einer unveränderlichen Datei auf dem Server.

Tricks

Statische Variable existiert nur in einem lokalen Funktionsumfang. Es kann nicht sein Zugriff außerhalb der Funktion, in der sie definiert wurde. Sie können also Stellen Sie sicher, dass der Wert bis zum nächsten Aufruf von .__ unverändert bleibt. diese Funktion.

Statische Variablen können nur als Skalar oder als Skalar definiert werden Ausdruck (seit PHP 5.6). Andere Werte zwangsläufig zuweisen führt zu einem Fehler, zumindest in dem Moment, in dem dieser Artikel geschrieben wurde .. Trotzdem können Sie dies nur in der nächsten Codezeile tun:

function countSheep($num) {
  static $counter = 0;
  $counter += sqrt($num);//imagine we need to take root of our sheep each time
  echo "$counter sheep jumped over fence";
}

Ergebnis:

2 sheep jumped over fence
5 sheep jumped over fence
9 sheep jumped over fence

Die statische Funktion wird irgendwie zwischen den Methoden der Objekte des .__ geteilt. selbe Klasse. Es ist leicht zu verstehen, wenn Sie das folgende Beispiel betrachten:

class SomeClass {
  public function foo() {
    static $x = 0;
    echo ++$x;
  }
}

$object1 = new SomeClass;
$object2 = new SomeClass;

$object1->foo(); // 1
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
$object1->foo(); // 3 now $object1 increments $x
$object2->foo(); // 4 and now his twin brother

Dies funktioniert nur bei Objekten derselben Klasse. Wenn Objekte aus verschiedenen Klassen stammen (sich sogar erweitern), wird das Verhalten statischer Variablen wie erwartet sein.

Ist die statische Variable die einzige Möglichkeit, Werte zwischen Aufrufen einer Funktion zu behalten?

Eine andere Möglichkeit, Werte zwischen Funktionsaufrufen zu behalten, ist die Verwendung von Closures. Closures wurden in PHP 5.3 eingeführt. Mit zwei Worten können Sie den Zugriff auf einige Variablensätze innerhalb eines Funktionsbereichs auf eine andere anonyme Funktion beschränken, die die einzige Möglichkeit darstellt, auf sie zuzugreifen. Abgeschlossene Variablen können (mehr oder weniger erfolgreich) OOP Konzepte wie 'Klassenkonstanten' (wenn sie beim Schließen durch Wert übergeben wurden) oder 'private Eigenschaften' (wenn durch Verweis übergeben) in der strukturierten Programmierung imitieren.

Letzteres erlaubt eigentlich die Verwendung von Closures anstelle von statischen Variablen. Was zu verwenden ist, ist immer die Entscheidung des Entwicklers, aber es sollte erwähnt werden, dass statische Variablen definitiv nützlich sind, wenn sie mit Rekursionen arbeiten und von Entwicklern wahrgenommen werden sollten.

0
alex_edev