Der Code lautet wie folgt:
<code>$a = [1, 2, 3]; foreach($a as $key => &$value) { $value = 5; } var_dump($a);</code>
Das endgültige Ausgabeergebnis ist wie folgt:
<code>array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }</code>
Frage: Warum erscheint das Adresszeichen vor dem letzten Schlüsselwert?
Der Code lautet wie folgt:
<code>$a = [1, 2, 3]; foreach($a as $key => &$value) { $value = 5; } var_dump($a);</code>
Das endgültige Ausgabeergebnis ist wie folgt:
<code>array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }</code>
Frage: Warum erscheint das Adresszeichen vor dem letzten Schlüsselwert?
Das & in diesem var_dump bedeutet, dass Sie eine andere Variable verwenden können, um ihren Wert zu ändern.
Gefällt dir
<code class="php">$b = &$a[0]; var_dump($a);</code>
Wenn Sie hier drucken, erscheint im ersten Schlüsselwert ein &-Symbol, das darauf hinweist, dass Sie andere Variablen ($b) verwenden können, um seinen Wert zu ändern.
Lassen Sie uns zunächst die grundlegende Verwendung von &
verstehen.
<code class="php">$b = $c = 1; $a = &$b; $a = 2; echo "b=$b,c=$c\n"; $a = &$c; $a = 100; $a = 200; echo "b=$b,c=$c\n"; unset($a); $a = 500; echo "b=$b,c=$c\n";</code>
Nachdem $a oben als Referenz auf $b angegeben wurde, wird durch die Änderung von $a der Wert des entsprechenden $b geändert, es sei denn, es wird erneut als andere Referenz angegeben oder nicht gesetzt ($a).
Das Gleiche gilt für Ihr foreach. Wenn Sie die Schleife in einzelne Schritte aufteilen, sieht es so aus:
<code class="php">$value = &$a[0]; $value = 5; $value = &$a[1]; $value = 5; $value = &$a[2]; $value = 5;</code>
Wenn die Schleife bis zum Ende läuft, ist $value eine Referenz auf $a[2] und entspricht daher dieser Form:
<code class="php">$a[0] = 5; $a[1] = 5; $value = &$a[2]; $a[2] = 5; var_dump($a);</code>
Es ist nicht schwer zu verstehen, warum var_dump ein &-Symbol auf dem letzten Schlüssel-Wert-Paar druckt.
Unter normalen Umständen wird dies keine großen Probleme verursachen, aber aufgrund des Bereichsproblems von foreach kann $value nach Beendigung der Schleife weiterhin verwendet werden, sodass einige unglaubliche Fehler auftreten.
Gefällt mir
<code class="php">$a = [1, 2, 3]; foreach($a as $key => &$value) { $value = $value+5; } var_dump($a); // [6,7,8] foreach($a as $value){} var_dump($a); // [6,7,7]</code>
Nachdem ein leeres foreach hinzugefügt wurde, wird $a unzumutbar. Der Grund liegt auch darin, dass der $-Wert im leeren foreach ein Verweis auf das oberste &a[2] ist.
Das leere foreach entspricht diesem:
<code class="php">$value = &$a[2]; $value = $a[0]; $value = $a[1]; $value = $a[2];</code>
Ist Ihnen aufgefallen, dass das Obige wie folgt umgeschrieben werden kann, da $value eine Referenz auf $a[2] ist:
<code class="php">$a[2] = $a[0]; $a[2] = $a[1]; $a[2] = $a[2];</code>
$a[2] ändert sich ständig im leeren foreach, und da $a[2] zum Wert von $a[1] geworden ist, ist $a[2] = $a[2]; nein Für jede Auswirkung , der Wert ist immer noch $a[1];
Dieser unglaubliche Fehler wird durch den Gültigkeitsbereich der Variablen $value verursacht, daher müssen Sie zuerst entweder den Namen ändern oder $value deaktivieren.
<code class="php">$a = [1, 2, 3]; foreach($a as $key => &$value) { $value = $value+5; } var_dump($a); // 要么unset unset($value); // 要么foreach里不要用上面同名的$value,改为$value2222 foreach($a as $value2222){} var_dump($a);</code>
Zuerst möchte ich sagen, dass dies eine sehr, sehrgute Frage ist. Ich glaube, dass der Fragesteller nicht unfähig ist, zwischen Anführungszeichen und Nicht-Anführungszeichen zu unterscheiden.
Ich habe zuerst zwei Tests gemacht:
<code>$a = [1, 2, 3]; foreach($a as $key => &$value) { $value = 5; } foreach($a as $key => $value) { $value = 6; } var_dump($a);</code>
Was schätzen Sie als Ergebnis?
<code>array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(6) }</code>
Ein weiterer Test ist:
<code>$a = [1, 2, 3]; foreach($a as $key => &$value) { $value = 5; } foreach($a as $key => $value2) { $value2 = 6; } var_dump($a);</code>
Die Ausgabe sieht dieses Mal viel normaler aus:
<code>array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }</code>
Dieses Problem sollte also eine Falle globaler PHP-Variablen sein.