首頁 >後端開發 >php教程 >為什麼帶有引用傳遞 (&) 的 PHP foreach 會意外更改陣列元素?

為什麼帶有引用傳遞 (&) 的 PHP foreach 會意外更改陣列元素?

DDD
DDD原創
2024-12-11 04:41:09418瀏覽

Why does PHP's foreach with pass-by-reference (&) change array elements unexpectedly?

PHP 在 Foreach 中按引用傳遞

在 PHP 中,變數可以是普通變量,也可以是引用變數。當將一個變數的引用分配給另一個變數時,後者成為引用變量,本質上綁定到與原始變數相同的記憶體位置。當使用帶有引用傳遞語法 (&) 的 foreach 迴圈時,此行為會產生影響。

考慮以下程式碼:

$a = ['zero', 'one', 'two', 'three'];

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v . PHP_EOL;
}

此程式碼的輸出為:

zero one two two

為什麼會發生這種情況?

在第一個 foreach 迴圈中,$a 的每個元素都被指派為變數 $v 的參考。這意味著對 $v 的任何修改也會修改 $a 中的相應元素。

具體來說,在第一個循環的最後一次迭代期間,$v 被分配 $a[3] 的值(即,'三')。但是,此賦值建立了引用關係,因此 $a[3] 成為引用變數(即使沒有使用 & 明確賦值)。

在第二個 foreach 迴圈中,$a[3] 中元素的值a 被列印。然而,由於 $a[3] 現在是一個引用變量,它的值隨著 $v 的值而變化。當 $v 在第三次迭代中被賦值為「two」時,$a[3] 也變成「two」。

因此,在最後一次迭代中,$v(仍然指向 $a) [3]) 的值為“two”,並且印出“two”。這解釋了為什麼在最後一次迭代中重複“二”,而不是像人們直觀期望的那樣打印“三”。

以上是為什麼帶有引用傳遞 (&) 的 PHP foreach 會意外更改陣列元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn