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; }
Output kod ini ialah:
zero one two two
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!