mata teras
yield
untuk menyelamatkan keadaannya dan terus dari gangguan apabila dipanggil semula. return
send()
bagaimana penjana berfungsi
Menurut definisi Wikipedia, penjana adalah "sangat mirip dengan fungsi yang mengembalikan array, kerana penjana mempunyai parameter yang boleh dipanggil dan menghasilkan satu siri nilai". Penjana pada dasarnya adalah fungsi biasa, tetapi bukannya mengembalikan nilai, ia menghasilkan seberapa banyak nilai yang diperlukan. Ia kelihatan seperti fungsi, tetapi berkelakuan seperti iterator. Penjana menggunakan kata kunci dan bukannya yield
. Ia berfungsi sama dengan return
kerana ia mengembalikan nilai kepada pemanggil fungsi, tetapi return
tidak mengeluarkan fungsi dari timbunan, tetapi menjimatkan keadaannya. Ini membolehkan fungsi untuk meneruskan pelaksanaan dari gangguan. Malah, anda tidak boleh mengembalikan nilai dari penjana, walaupun anda boleh menamatkan pelaksanaannya dengan yield
tanpa nilai. Manual PHP menyatakan: "Apabila fungsi penjana dipanggil, ia mengembalikan objek yang boleh diulang." Apabila anda melangkah ke atas objek, PHP memanggil penjana setiap kali nilai diperlukan. Apabila penjana menjana nilai, keadaan disimpan supaya ia dapat dipulihkan apabila nilai seterusnya diperlukan. return
<?php function nums() { echo "The generator has started\n"; for ($i = 0; $i < 5; $i++) { yield $i; echo "Yielded $i\n"; } echo "The generator has ended\n"; } foreach (nums() as $v); ?>
<code>The generator has started Yielded 0 Yielded 1 Yielded 2 Yielded 3 Yielded 4 The generator has ended</code>
Penjana pertama kami
Generator bukan konsep baru. Berikut adalah contoh python:
yield
def file_lines(filename): file = open(filename) for line in file: yield line file.close() for line in file_lines('somefile'): #do some work here
<?php function nums() { echo "The generator has started\n"; for ($i = 0; $i < 5; $i++) { yield $i; echo "Yielded $i\n"; } echo "The generator has ended\n"; } foreach (nums() as $v); ?>
Fungsi penjana membuka fail dan kemudian menghasilkan setiap baris fail yang diperlukan. Setiap kali penjana dipanggil, ia terus dilaksanakan dari gangguan. Ia tidak bermula dari awal kerana apabila pernyataan yield
dilaksanakan, keadaannya disimpan. Sebaik sahaja semua baris dibaca, penjana hanya tamat dan gelung berakhir.
Kunci kembali
PHP Iterator terdiri daripada pasangan kunci/nilai. Dalam contoh kami, hanya satu nilai yang dikembalikan, jadi kunci adalah nombor (secara lalai kekunci adalah nombor). Jika anda ingin mengembalikan pasangan yang berkaitan, hanya ubah pernyataan yield
untuk memasukkan kunci menggunakan sintaks array.
<code>The generator has started Yielded 0 Yielded 1 Yielded 2 Yielded 3 Yielded 4 The generator has ended</code>
Nilai suntikan
yield
bukan sahaja mengembalikan nilai; ia juga boleh menerima nilai luaran. Ini dilakukan dengan memanggil kaedah send()
objek penjana dengan nilai yang anda mahu lulus. Nilai ini kemudiannya boleh digunakan untuk mengira atau melaksanakan operasi lain. Kaedah ini menghantar nilai sebagai hasil ungkapan yield
kepada penjana dan meneruskan pelaksanaan.
def file_lines(filename): file = open(filename) for line in file: yield line file.close() for line in file_lines('somefile'): #do some work here
output akan:
<?php function file_lines($filename) { $file = fopen($filename, 'r'); while (($line = fgets($file)) !== false) { yield $line; } fclose($file); } foreach (file_lines('somefile') as $line) { // do some work here } ?>
Simpan Memori Menggunakan Penjana
Penjana berguna apabila anda mengira koleksi besar dan tidak mahu memperuntukkan memori untuk semua hasil pada masa yang sama, atau apabila anda tidak tahu sama ada semua keputusan diperlukan. Oleh kerana hasilnya diproses, penggunaan memori dapat dikurangkan ke tahap yang sangat rendah dengan memperuntukkan memori hanya untuk hasil semasa. Bayangkan fungsi file()
, yang mengembalikan semua baris dalam fail sebagai array. Jalankan penanda aras mudah untuk fungsi file()
dan fungsi demo file_lines()
kami, masing-masing menggunakan fail teks 100 segmen rawak yang sama yang dijana menggunakan Lipsum, dan hasilnya menunjukkan bahawa fungsi file
menggunakan paling banyak penjana 110 kali
<?php function file_lines($filename) { // ... yield $key => $line; // ... } foreach (file_lines('somefile') as $key => $line) { // do some work here } ?>
Kesimpulan
Dengan pengenalan penjana, PHP menyediakan pemaju dengan alat yang berkuasa. Kita kini boleh menulis Iterator dengan cepat sambil menyimpan banyak ingatan. Melalui tutorial ini, saya harap anda mendapat pengetahuan yang cukup untuk mula menggunakannya dalam projek anda. Secara peribadi, saya telah memikirkan banyak objek untuk menulis semula. Sekiranya anda mempunyai idea atau komen, sila tinggalkan komen anda.
FAQs untuk penjana php
(Soalan Lazim yang disenaraikan dalam teks asal hendaklah disertakan di sini, dan disebabkan oleh batasan ruang, ia ditinggalkan di sini.)
Atas ialah kandungan terperinci PHP Master | Penjana dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!