Mengapakah elemen terakhir tatasusunan PHP kelihatan diduplikasi selepas menggunakan foreach dengan rujukan lulus?

Susan Sarandon
Lepaskan: 2024-11-15 00:18:02
asal
955 orang telah melayarinya

Why does the last element of a PHP array appear duplicated after using foreach with pass-by-reference?

PHP Foreach Pass by Rujukan: Penduaan Elemen Misterius

Pengenalan:

Adakah anda mengalami fenomena ganjil di mana yang terakhir elemen tatasusunan PHP anda kelihatan diduakan selepas melelakannya menggunakan foreach dengan rujukan lulus? Tingkah laku yang membingungkan ini sering menimbulkan persoalan tentang potensi pepijat atau tingkah laku sistem yang pelik.

Memahami Tingkah Laku:

Kunci untuk memahami perkara ini ialah sifat rujukan lalu-lalu dalam gelung foreach PHP. Apabila menggunakan '&' dalam parameter, rujukan kepada elemen tatasusunan diubah suai secara langsung, bukannya salinan. Ini bermakna bahawa sebarang perubahan yang dibuat kepada pembolehubah yang diluluskan dalam gelung secara langsung mempengaruhi tatasusunan asal.

Pepijat yang Dipertanyakan:

Dalam contoh yang disediakan:

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

foreach ($arr as &$item) {}
foreach ($arr as $item) {}
Salin selepas log masuk

Gelung foreach pertama mewujudkan rujukan kepada elemen tatasusunan. Memandangkan $item kini menjadi rujukan, mengubah suainya dalam gelung juga akan menukar elemen tatasusunan yang sepadan.

Gelung foreach kedua, walau bagaimanapun, tidak mewujudkan rujukan. Ini bermakna apabila gelung memberikan nilai baharu kepada $item, ia hanya menjejaskan salinan setempat dan tidak mengemas kini tatasusunan asal.

Kesan Duplikasi:

Sekarang , mari kita pertimbangkan kes di mana $item adalah rujukan kepada elemen tatasusunan terakhir (iaitu, 'baz'). Oleh kerana gelung pertama menetapkan rujukan ini, gelung kedua juga menggunakan rujukan yang sama. Akibatnya, sebarang nilai yang diberikan kepada $item dalam gelung kedua akan dihantar terus ke $arr[2].

Oleh itu, apabila gelung kedua memberikan 'bar' kepada $item, ia secara tidak sengaja menggantikan elemen terakhir daripada tatasusunan dengan 'bar,' yang membawa kepada pendua yang jelas.

Dijangka lwn. Sebenar Output:

Sebelum gelung: ["foo", "bar", "baz"]

Selepas gelung pertama (rujukan): ["foo", "bar" , "foo"] (memandangkan $item masih dirujuk kepada $arr[2])

Selepas gelung kedua (bukan rujukan): ["foo", "bar", "bar"]

Adakah Ia Pepijat?

Tidak, tingkah laku ini bukan pepijat. Ia hanyalah akibat yang dijangkakan daripada menggunakan rujukan dalam gelung foreach PHP. Nilai $item, sebagai rujukan kepada elemen tatasusunan asal, mempengaruhi tatasusunan asas apabila ia diubah suai.

Atas ialah kandungan terperinci Mengapakah elemen terakhir tatasusunan PHP kelihatan diduplikasi selepas menggunakan foreach dengan rujukan lulus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan