Apa yield?
Kata yieldkunci 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 $keydalam foreachdengan menggunakan
yield $someKey => $someValue;
Dalam fungsi generator, $someKeyadalah apa pun yang Anda inginkan muncul $keydan $someValuemenjadi nilai $val. Dalam contoh pertanyaan itu$i .
Apa bedanya dengan fungsi normal?
Sekarang Anda mungkin bertanya-tanya mengapa kami tidak hanya menggunakan rangefungsi asli PHP untuk mencapai hasil itu. Dan Anda benar. Outputnya akan sama. Perbedaannya adalah bagaimana kita sampai di sana.
Ketika kita menggunakan rangePHP, akan melaksanakannya, membuat seluruh array angka dalam memori dan returnbahwa seluruh array ke foreachlingkaran yang kemudian akan pergi lebih dari itu dan output nilai-nilai. Dengan kata lain, foreachakan beroperasi pada array itu sendiri. The rangeFungsi dan foreachhanya "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 yieldkata 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 xrangememegang forloop, itu akan mengeksekusi dan menghasilkan sampai $maxtercapai. Anggap saja seperti foreachdan 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 yieldkunci 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 yieldsebelum 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