為什麼在 PHP `foreach` 迴圈中使用參考傳遞會在迴圈結束後修改陣列?

Susan Sarandon
發布: 2024-11-13 09:19:02
原創
391 人瀏覽過

Why does using pass-by-reference in a PHP `foreach` loop modify the array after the loop ends?

PHP Foreach 依引用傳遞和陣列修改

在 PHP 中,在 foreach 迴圈中使用按引用傳遞可能會導致意外行為。考慮以下程式碼:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) {}
// Array remains unchanged: ["foo", "bar", "baz"]

foreach ($arr as $item) {}
// Array is modified: ["foo", "bar", "bar"]
登入後複製

為什麼第二個循環會修改陣列?

在第一個循環中,$item 變數是透過引用傳遞的。這意味著對 $item 所做的變更也會影響 $arr 陣列中的對應元素。但是,在第二個循環中,$item 是按值傳遞的。因此,對 $item 所做的變更不會影響陣列。

至關重要的是,在第一個循環之後,$item 仍然引用 $arr 的最後一個元素。當第二個迴圈遍歷數組時,$item 的每個值都會覆寫 $arr 的最後一個元素,因為它們都引用相同的記憶體位置。

調試輸出

要理解其行為,我們可以回顯$item 的當前值並在每次循環期間遞歸打印$arr 數組

第一次循環:

foo
Array ( [0] => foo [1] => bar [2] => baz )

bar
Array ( [0] => foo [1] => bar [2] => baz )

baz
Array ( [0] => foo [1] => bar [2] => baz )
登入後複製

第一次循環後,$item 指向$arr 的最後一個元素。

第二個循環:

foo
Array ( [0] => foo [1] => bar [2] => foo )

bar
Array ( [0] => foo [1] => bar [2] => bar )

bar
Array ( [0] => foo [1] => bar [2] => bar )
登入後複製

作為每個值$item 被覆蓋,它還修改了 $arr 的最後一個元素。

這是一個 Bug 嗎?

不,這種行為不是一個 Bug,而是預期的傳遞引用的行為。了解透過引用傳遞變數的含義並正確使用它非常重要。

以上是為什麼在 PHP `foreach` 迴圈中使用參考傳遞會在迴圈結束後修改陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板