Rumah > pembangunan bahagian belakang > tutorial php > Mengapakah PHP foreach dengan pass-by-reference (&) mengubah elemen tatasusunan secara tidak dijangka?

Mengapakah PHP foreach dengan pass-by-reference (&) mengubah elemen tatasusunan secara tidak dijangka?

DDD
Lepaskan: 2024-12-11 04:41:09
asal
432 orang telah melayarinya

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

PHP Pass by Rujukan dalam Foreach

Dalam PHP, pembolehubah boleh sama ada pembolehubah biasa atau pembolehubah rujukan. Apabila memberikan rujukan pembolehubah kepada pembolehubah lain, pembolehubah tersebut menjadi pembolehubah rujukan, pada asasnya mengikat lokasi memori yang sama seperti asal. Tingkah laku ini mempunyai implikasi apabila menggunakan gelung foreach dengan sintaks rujukan laluan (&).

Pertimbangkan kod berikut:

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

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v . PHP_EOL;
}
Salin selepas log masuk

Output kod ini ialah:

zero one two two
Salin selepas log masuk

Mengapa ini berlaku?

Dalam gelung foreach pertama, setiap elemen $a ditetapkan sebagai rujukan kepada pembolehubah $v. Ini bermakna bahawa sebarang pengubahsuaian kepada $v turut mengubah suai elemen yang sepadan dalam $a.

Khususnya, semasa lelaran terakhir bagi gelung pertama, $v diberikan nilai $a[3] (iaitu, ' tiga'). Walau bagaimanapun, tugasan ini mewujudkan hubungan rujukan, jadi $a[3] menjadi pembolehubah rujukan (walaupun ia tidak ditetapkan secara eksplisit menggunakan &).

Dalam gelung foreach kedua, nilai elemen dalam $ a dicetak. Walau bagaimanapun, memandangkan $a[3] kini merupakan pembolehubah rujukan, nilainya berubah bersama dengan nilai $v. Apabila $v diberikan nilai 'dua' semasa lelaran ketiga, $a[3] juga menjadi 'dua'.

Akibatnya, dalam lelaran terakhir, $v (yang masih menunjuk ke $a [3]) mempunyai nilai 'dua', dan 'dua' dicetak. Ini menerangkan sebab 'dua' diulang dalam lelaran terakhir, bukannya mencetak 'tiga' seperti yang dijangkakan secara intuitif.

Atas ialah kandungan terperinci Mengapakah PHP foreach dengan pass-by-reference (&) mengubah elemen tatasusunan secara tidak dijangka?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan