Rumah >pembangunan bahagian belakang >tutorial php >Apakah penjana dalam PHP? Bagaimana untuk menggunakan
generator.php yang akan digunakan sepanjang contoh kami. Selepas mencipta fail, kami menambah sekeping kod.
<?php function getRange ($max = 10) { $array = []; for ($i = 1; $i < $max; $i++) { $array[] = $i; } return $array; } foreach (getRange(15) as $range) { echo "Dataset {$range} <br>"; }Kami boleh memulakan pelayan Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan terbina dalam dengan cepat dalam direktori tempat fail
generator.php dicipta:
php -S localhost:8000Jika anda membuka http dengan penyemak imbas: //localhost:8000/generator.php , kita sepatutnya melihat sesuatu seperti ini: Kod ini tidak begitu jelas Kod bit
<?php foreach (getRange(Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX) as $range) { echo "Dataset {$range} <br>"; }Kini, nilai maksimum yang boleh dijana oleh kod di atas ialah
Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX (iaitu nilai maksimum yang boleh dihasilkan oleh Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan apabila kita mengubah suainya seperti ini dan segarkan semula penyemak imbas, Kami dapati sesuatu yang berbeza kali ini Skrip penjana melemparkan mesej amaran.
Sayang kerana Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan kehabisan memori Penyelesaiannya mungkin termasuk meningkatkan had atasmemory_limit dalam fail php.ini Tetapi untuk bersikap adil, skrip ini tidak cekap dan memerlukan memori yang cekap dan satu skrip memori rendah.
Menggunakan Penjana Mari tentukan fungsi yang sama di atas, panggil dengan nilai yang samaApakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX dan jalankannya semula. Tetapi kali ini kita akan mencipta fungsi penjana.
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { yield $i; } } foreach (getRange(Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX) as $range) { echo "Dataset {$range} <br>"; }Menghuraikan fungsi
, kali ini, kita hanya mengulangi nilai dan getRange
output. yield
adalah serupa dengan mengembalikan nilai kerana ia juga mengembalikan nilai daripada fungsi, tetapi satu-satunya perbezaan ialah yield
hanya akan mengembalikan nilai apabila diperlukan dan tidak akan cuba menyimpan keseluruhan set data dalam ingatan. yield
Nota: Penjana hanya boleh digunakan dalam fungsi.
Mengapa menggunakan penjanaKadangkala, kita mungkin menghadapi situasi di mana kita ingin menghuraikan set data yang besar (mungkin fail log), atau set hasil pangkalan data yang besar Lakukan pengiraan, dsb. . Kami tidak mahu semua data ini dimuatkan ke dalam memori. Kita harus menyimpan keadaan memori yang sepadan sebanyak mungkin. Data tidak semestinya besar - penjana adalah cekap tidak kira betapa kecilnya data itu. Jangan lupa, matlamat kami adalah untuk menggunakan kurang memori untuk memproses data secepat mungkin. Kembalikan pasangan nilai kunciKadangkala, data kami lebih meyakinkan apabila ia berdasarkan nilai kunci. Apabila menggunakan penjana, kami mungkin menjana pasangan nilai kunci seperti berikut.<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { $value = $i * mt_rand(); yield $i => $value; } }Kemudian, kita boleh menggunakan pasangan nilai kunci ini sama seperti mana-mana tatasusunan.
<?php foreach (getRange(Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX) as $range => $value) { echo "Dataset {$range} has {$value} value<br>"; }Masukkan parameter ke dalam penjana Penjana juga boleh menerima parameter. Ini bermakna penjana membenarkan kita menyuntik parameter ke dalamnya, sebagai arahan atau fungsi lain. Sebagai contoh, kami menghantar nilai kepada penjana untuk menghentikan pelaksanaannya atau mengubah suai outputnya. Menggunakan fungsi
di atas, kita boleh mencapai ini. getRange
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { $injected = yield $i; if ($injected === 'stop') return; } }Untuk menghantar suntikan nilai ini kita boleh lakukan ini.
<?php $generator = getRange(Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX); foreach ($generator as $range) { if ($range === 10000) { $generator->send('stop'); } echo "Dataset {$range} <br>"; }
Nota: Menggunakan pulangan dalam penjana akan melompat keluar daripada penjana.
Jangan menyalahgunakan penjanaWalaupun menggunakanApakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX agak berlebihan Tetapi bagi saya, Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan_INT_MAX adalah 2147483. 🎜> Iaitu:
Dua bilion empat ribu tujuh ratus empat puluh ribu empat ratus lapan puluh tiga ribu enam ratus empat puluh tujuhPenjana menjadikan penggunaan memori lebih banyak cekap. Tetapi jika disalahgunakan, ia juga boleh menyebabkan masalah berkaitan ingatan.
Penjana memberikan peningkatan prestasi ketara yang sukar diabaikan. Selalunya, kami tidak memerlukan pelayan konfigurasi tinggi untuk menjalankan kod. Kita hanya perlu melakukan sedikit pemfaktoran semula, penjana sangat berguna dan kita harus menggunakannya lebih
Alamat asal bahasa Inggeris: https://scotch.io/tutorials/understanding-php-generators
Pembelajaran yang disyorkan: "Tutorial Video Apakah penjana dalam Apakah penjana dalam PHP? Bagaimana untuk menggunakan? Bagaimana untuk menggunakan"
Atas ialah kandungan terperinci Apakah penjana dalam PHP? Bagaimana untuk menggunakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!