Rumah > pembangunan bahagian belakang > tutorial php > Bagaimana Gelung `foreach` PHP Sebenarnya Berfungsi, dan Bagaimana Pelaksanaannya Berubah Antara PHP 5 dan PHP 7?

Bagaimana Gelung `foreach` PHP Sebenarnya Berfungsi, dan Bagaimana Pelaksanaannya Berubah Antara PHP 5 dan PHP 7?

Mary-Kate Olsen
Lepaskan: 2024-12-23 22:20:18
asal
395 orang telah melayarinya

How Does PHP's `foreach` Loop Actually Work, and How Has Its Implementation Changed Between PHP 5 and PHP 7?

Bagaimana foreach sebenarnya berfungsi dalam PHP?

Pengenalan:
foreach digunakan secara meluas dalam PHP untuk gelung melalui tatasusunan, objek dan struktur data lain. Memahami kerja dalamannya adalah penting untuk mengelakkan tingkah laku yang tidak dijangka.

Tiga Jenis foreach Iterables:
foreach menyokong tiga jenis iterables:

  • Arrays
  • Biasa objek
  • Objek boleh lalui

Lelaran Objek Boleh Travers:
Untuk objek Boleh Travers, foreach bertindak sebagai gula sintaksis untuk:

foreach ($it as $k => $v) {}

translates to:

if ($it instanceof IteratorAggregate) {
    $it = $it->getIterator();
}
for ($it->rewind(); $it->valid(); $it->next()) {
    $v = $it->current();
    $k = $it->key();
    // ...
}
Salin selepas log masuk

Susun atur dan Objek Lelaran:

Kamus Tertib:
Tatasusunan dan objek PHP pada asasnya ialah kamus tersusun yang mengekalkan susunan sisipan. Lelaran mengikut tertib ini.

Penukaran Objek:
Perwakilan objek yang dibungkus ditukar kepada kamus semasa lelaran. Oleh itu, lelaran objek biasa menjadi serupa dengan lelaran tatasusunan.

Penunjuk Tatasusunan Dalaman (IAP):
Tasusunan dalam PHP 5 mempunyai penunjuk tatasusunan dalaman (IAP) yang menyokong pengubahsuaian dan melangkau terlebih dikeluarkan elemen.

HashPointer:
foreach dalam PHP 5 menggunakan HashPointer untuk menyandarkan kedudukan IAP dan cincang sebelum menjalankan badan gelung. Ia memulihkannya selepas itu jika unsur itu masih wujud; jika tidak, ia menggunakan kedudukan IAP semasa.

Penduaan Tatasusunan:
foreach dalam PHP 5 menduplikasi tatasusunan yang bukan rujukan (is_ref=0) dan mempunyai kiraan semula lebih daripada 1.

PHP 5 Contoh:

  • Dalam kes ujian 1 dan 2, tatasusunan tidak diduplikasi kerana ia mempunyai kiraan semula=1 dan diluluskan mengikut nilai.
  • Dalam kes ujian 3, IAP ditetapkan pada penghujung tatasusunan selepas gelung disebabkan oleh penyingkiran unsur.
  • Dalam kes ujian 4 dan 5, tatasusunan diduplikasi kerana fungsi by-ref (setiap, set semula) menerima rujukan kepada tatasusunan pendua.

Perubahan PHP 7:

Pelajar Hashtable:
PHP 7 menggunakan iterator jadual hash luaran, didaftarkan dalam tatasusunan. Setiap iterator dimajukan jika elemen yang sepadan dialih keluar.

Tiada Penggunaan IAP oleh foreach:
foreach tidak lagi menggunakan IAP, menghapuskan keperluan untuk pendua. Lelaran tatasusunan nilai ikut sentiasa menggunakan elemen asal.

Penduaan Tatasusunan:
Tasusunan tidak lagi diduplikasi semasa lelaran nilai mengikut, tanpa mengira pengiraan semula atau status rujukannya.

Contoh PHP 7:

  • Dalam PHP 7, kes ujian 1 dan 2 mempunyai output yang sama seperti dalam PHP 5 kerana tatasusunan tidak diduplikasi.
  • Dalam PHP 7, kes ujian 3 menghasilkan output yang berbeza kerana gelung no lebih lama mempengaruhi IAP.
  • Dalam PHP 7, kes ujian 4 dan 5 berkelakuan serupa kerana setiap satu dan set semula masih menduplikasi tatasusunan, manakala foreach menggunakan tatasusunan asal.

Peningkatan PHP 7 Tambahan:

  • Gelung luar dalam lelaran bersarang tidak lagi dibatalkan apabila elemen dialih keluar dalam gelung dalaman.
  • Masalah "anak panah dalam masa" ialah diselesaikan.

Atas ialah kandungan terperinci Bagaimana Gelung `foreach` PHP Sebenarnya Berfungsi, dan Bagaimana Pelaksanaannya Berubah Antara PHP 5 dan PHP 7?. 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