Apa yield
?
Kata yield
kunci mengembalikan data dari fungsi generator:
Jantung dari fungsi generator adalah kata kunci hasil. Dalam bentuknya yang paling sederhana, pernyataan hasil lebih terlihat seperti pernyataan pengembalian, kecuali bahwa alih-alih menghentikan eksekusi fungsi dan kembali, hasil sebaliknya memberikan nilai pada perulangan kode di atas generator dan menghentikan sementara eksekusi fungsi generator.
Apa itu fungsi generator?
Fungsi generator secara efektif merupakan cara yang lebih ringkas dan efisien untuk menulis Iterator . Ini memungkinkan Anda untuk mendefinisikan fungsi (Anda xrange
) yang akan menghitung dan mengembalikan nilai saat Anda mengulanginya :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
Ini akan menghasilkan output sebagai berikut:
0 => 1
1 => 2
…
9 => 10
Anda juga dapat mengontrol $key
dalam foreach
dengan menggunakan
yield $someKey => $someValue;
Dalam fungsi generator, $someKey
adalah apa pun yang Anda inginkan muncul $key
dan $someValue
menjadi nilai $val
. Dalam contoh pertanyaan itu$i
.
Apa bedanya dengan fungsi normal?
Sekarang Anda mungkin bertanya-tanya mengapa kami tidak hanya menggunakan range
fungsi asli PHP untuk mencapai hasil itu. Dan Anda benar. Outputnya akan sama. Perbedaannya adalah bagaimana kita sampai di sana.
Ketika kita menggunakan range
PHP, akan melaksanakannya, membuat seluruh array angka dalam memori dan return
bahwa seluruh array ke foreach
lingkaran yang kemudian akan pergi lebih dari itu dan output nilai-nilai. Dengan kata lain, foreach
akan beroperasi pada array itu sendiri. The range
Fungsi dan foreach
hanya "bicara" sekali. Anggap saja seperti mendapatkan paket melalui pos. Si kurir akan menyerahkan paket itu kepada Anda dan pergi. Dan kemudian Anda membuka bungkus seluruh paket, mengambil apa pun yang ada di sana.
Ketika kita menggunakan fungsi generator, PHP akan masuk ke fungsi dan menjalankannya sampai memenuhi akhir atau yield
kata kunci. Ketika bertemu a yield
, ia kemudian akan mengembalikan nilai apa pun pada saat itu ke loop luar. Kemudian ia kembali ke fungsi generator dan berlanjut dari tempat ia menghasilkan. Karena Anda xrange
memegang for
loop, itu akan mengeksekusi dan menghasilkan sampai $max
tercapai. Anggap saja seperti foreach
dan generator bermain ping pong.
Mengapa saya membutuhkannya?
Jelas, generator dapat digunakan untuk bekerja di sekitar batas memori. Tergantung pada lingkungan Anda, melakukan range(1, 1000000)
wasiat akan mematikan skrip Anda sedangkan yang sama dengan generator hanya akan berfungsi dengan baik. Atau seperti yang Wikipedia katakan:
Karena generator menghitung nilai yang dihasilkan hanya berdasarkan permintaan, mereka berguna untuk mewakili urutan yang akan mahal atau tidak mungkin untuk dihitung sekaligus. Ini termasuk misalnya urutan tak terbatas dan aliran data langsung.
Generator juga seharusnya cukup cepat. Tetapi perlu diingat bahwa ketika kita berbicara tentang puasa, kita biasanya berbicara dalam jumlah yang sangat kecil. Jadi sebelum Anda sekarang lari dan mengubah semua kode Anda untuk menggunakan generator, lakukan benchmark untuk melihat di mana itu masuk akal.
Case Penggunaan lain untuk Generator adalah coroutine asinkron. Kata yield
kunci tidak hanya mengembalikan nilai tetapi juga menerimanya. Untuk detailnya, lihat dua posting blog bagus yang ditautkan di bawah ini.
Sejak kapan saya bisa menggunakan yield
?
Generator telah diperkenalkan di PHP 5.5 . Mencoba menggunakan yield
sebelum versi itu akan menghasilkan berbagai kesalahan parse, tergantung pada kode yang mengikuti kata kunci. Jadi, jika Anda mendapatkan kesalahan parse dari kode itu, perbarui PHP Anda.
Sumber dan bacaan lebih lanjut:
yeild
, katakanlah, solusi seperti ini: ideone.com/xgqevM