Rumah >pembangunan bahagian belakang >tutorial php >Mengapakah menggunakan rujukan pas dalam gelung `foreach` PHP mengubah suai tatasusunan selepas gelung berakhir?

Mengapakah menggunakan rujukan pas dalam gelung `foreach` PHP mengubah suai tatasusunan selepas gelung berakhir?

Susan Sarandon
Susan Sarandonasal
2024-11-13 09:19:02477semak imbas

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

PHP Foreach Pass melalui Rujukan dan Pengubahsuaian Tatasusunan

Dalam PHP, menggunakan rujukan lulus dalam gelung foreach boleh membawa kepada tingkah laku yang tidak dijangka. Pertimbangkan kod berikut:

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

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

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

Mengapakah gelung kedua mengubah suai tatasusunan?

Dalam gelung pertama, pembolehubah $item diluluskan melalui rujukan. Ini bermakna bahawa perubahan yang dibuat kepada $item juga mempengaruhi elemen yang sepadan dalam tatasusunan $arr. Walau bagaimanapun, dalam gelung kedua, $item diluluskan oleh nilai. Oleh itu, perubahan yang dibuat kepada $item tidak menjejaskan tatasusunan.

Yang penting, selepas gelung pertama, $item masih merujuk elemen terakhir $arr. Apabila gelung kedua berulang pada tatasusunan, setiap nilai $item menimpa elemen terakhir $arr kerana kedua-duanya merujuk kepada lokasi memori yang sama.

Menyahpepijat Output

Untuk memahami gelagat, kita boleh menggemakan nilai semasa $item dan mencetak rekursif tatasusunan $arr semasa setiap lelaran gelung.

Gelung Pertama:

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

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

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

Selepas gelung pertama, $item menunjuk ke elemen terakhir $arr.

Gelung Kedua:

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

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

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

Memandangkan setiap nilai $item ditimpa , ia juga mengubah suai elemen terakhir $arr.

Adakah ia Pepijat?

Tidak, tingkah laku ini bukan pepijat melainkan tingkah laku yang dimaksudkan oleh pas- rujukan oleh. Adalah penting untuk memahami implikasi menghantar pembolehubah melalui rujukan dan menggunakannya dengan sewajarnya.

Atas ialah kandungan terperinci Mengapakah menggunakan rujukan pas dalam gelung `foreach` PHP mengubah suai tatasusunan selepas gelung berakhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn