Heim >Backend-Entwicklung >PHP-Tutorial >Das Problem der Verwendung von & für Schlüsselwerte in der foreach-Schleife in PHP

Das Problem der Verwendung von & für Schlüsselwerte in der foreach-Schleife in PHP

WBOY
WBOYOriginal
2016-08-04 09:19:491320Durchsuche

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?

Antwortinhalt:

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn