foreach mengubah suai



1. Gelung foreach() tidak lagi berfungsi pada penunjuk dalaman tatasusunan.

$array = [0, 1, 2];
foreach ($array as &$val) 
{
    var_dump(current($array));
}
Hasil operasi PHP7 akan mencetak int(0) tiga kali, yang bermaksud penunjuk dalaman tatasusunan tidak berubah.

Hasil larian sebelumnya akan mencetak int(1), int(2) dan bool(false)

2. Apabila gelung mengikut nilai, foreach ialah operasi salinan tatasusunan

Apabila foreach bergelung mengikut value ( by-value), foreach beroperasi pada salinan tatasusunan. Dengan cara ini, pengubahsuaian pada tatasusunan semasa gelung tidak akan menjejaskan kelakuan gelung.
$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
    var_dump($val);
    unset($array[1]);
}
Walaupun kod di atas menyahset elemen kedua tatasusunan dalam gelung, PHP7 masih akan mencetak tiga elemen: (0 1 2)

Versi lama PHP akan melangkau 1 dan hanya mencetak ( 0 2).

3. Apabila gelung berdasarkan rujukan, pengubahsuaian pada tatasusunan akan menjejaskan gelung.

Jika anda menggunakan rujukan semasa menggelung, pengubahsuaian pada tatasusunan akan menjejaskan kelakuan gelung. Walau bagaimanapun, versi PHP7 mengoptimumkan penyelenggaraan lokasi di bawah banyak senario. Contohnya, menambahkan elemen pada tatasusunan semasa menggelung.

$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}

Elemen yang dilampirkan dalam kod di atas juga akan mengambil bahagian dalam gelung, jadi PHP7 akan mencetak "int(0) int(1)", dan versi lama hanya akan mencetak "int(0)".

4. Menggulung pada objek mudah kosong (tidak boleh dilalui).

Menggelung pada objek mudah, sama ada menggelung mengikut nilai atau menggelung dengan rujukan, berkelakuan sama seperti menggelung melalui rujukan dalam tatasusunan. Walau bagaimanapun, pengurusan lokasi akan menjadi lebih tepat.

5 Kelakuan objek untuk objek Boleh Dilalui adalah sama seperti sebelumnya.

Nota editor: penjelasan stackoverflow di atas: Objek boleh dilalui ialah objek yang melaksanakan antara muka Iterator atau IteratorAggregate. Jika objek melaksanakan antara muka iterator atau IteratorAggregate, ia boleh dipanggil objek iterator.