Perbedaan antara return
dan yield
tampak jelas sampai saya menemukan ada juga yield from
dan kemungkinan untuk menggabungkan keduanya return
dan yield
dalam fungsi yang sama!
Pemahaman saya return
adalah bahwa semuanya setelah itu tidak dieksekusi, kan?
Namun:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Menghasilkan: "123"
Namun berikut ini:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
Tidak menghasilkan apa-apa! Jadi itu berarti hasil dieksekusi?
Apakah ini bug?
var_dump(generate()->GetReturn());
Jawaban:
Return
Cukup memberikan kembali nilai unik kepada pemanggil.
Yield
Ubah fungsi / metode saat ini untuk mengembalikan a
Generator
, yang akan menghasilkan lebih dari nilai unik: setiap kaliyield
dipicu, ini memberikan nilai kepada penelepon, satu per satu, secara tradisional menggunakanforeach
loop.Yield
+Return
Generator, selain menghasilkan nilai, juga dapat memberikan nilai pengembalian yang unik. Nilai itu tidak akan menjadi bagian dari perulangan di sekitar generator, itu harus diakses menggunakan
Generator::getReturn()
metode.Return
+Yield
Ini bisa dilihat sebagai bug, namun tidak.
Mereka adalah dua fase:
generate()
fungsi terlihat mengandungyield
kata kunci, karena itu ditandai sebagai menghasilkan aGenerator
.return
kebetulan sebelumyield
, generator tidak memiliki kesempatan untuk menghasilkan nilai apa pun. Namun,[1, 2, 3]
array dapat diambil denganGenerator::getReturn()
.Contoh beranotasi lengkap:
sumber
Dari dokumentasi :
Jadi tidak masalah apakah
yield
dieksekusi, parser melihatnya di suatu tempat dalam definisi fungsi dan mengubahnya menjadi generator.Jika fungsi tidak pernah menjalankan
yield
pernyataan, maka generator tidak menghasilkan nilai apa pun. Nilai yang dikembalikan olehreturn
diabaikan ketika Anda mencoba menggunakan hasilnya. Dokumentasi mengatakan:Jadi Anda bisa melakukan:
sumber