Sebelum menerangkan penjana, mari perkenalkan iterator:
Dalam PHP , biasanya gunakan foreach untuk melintasi tatasusunan.
Bagaimana jika kita mahu menjadikan objek boleh dilalui?
PHP memberikan kami antara muka Iterator Selagi antara muka ini dilaksanakan, objek ini boleh diulang melalui foreach.
Contohnya adalah seperti berikut:
class myIterator implements Iterator { private $index = 0; private $data = ''; public function __construct($data) { $this->index = 0; $this->data = $data; } function rewind() { $this->index = 0; } function current() { return $this->data[$this->index]; } function key() { return $this->index; } function next() { ++$this->index; } function valid() { return isset($this->data[$this->index]); } } $it = new myIterator(array( "hello", "php", "iterator", )); foreach($it as $key => $value) { echo "$key : $value<br>"; }
Apabila kita melintasi $it melalui foreach, PHP akan memanggil dirinya dalam urutan:
rewind() Set semula kepada elemen pertama
valid() Semak sama ada kedudukan semasa adalah sah
current() Kembalikan elemen semasa
key() Kembalikan kekunci elemen semasa
next( ) Tuding pada elemen seterusnya
Penjana ialah ciri baharu yang diperkenalkan dalam PHP 5.5, tetapi sebilangan kecil orang nampaknya menggunakannya pada masa ini.
Mari kita lihat penjelasan penjana dalam dokumentasi rasmi PHP:
Penjana menyediakan cara yang lebih mudah untuk melaksanakan lelaran objek mudah, berbanding dengan mentakrifkan kelas untuk melaksanakan antara muka Iterator, prestasi overhed dan kerumitan sangat dikurangkan.
Penjana membenarkan anda menulis kod dalam setiap blok untuk mengulangi set data tanpa membuat tatasusunan dalam ingatan, yang akan mencapai had ingatan anda atau mengambil masa pemprosesan yang agak lama.
Sebaliknya, anda boleh menulis fungsi penjana, sama seperti fungsi tersuai biasa Tidak seperti fungsi biasa yang hanya kembali sekali, penjana boleh menghasilkan sebanyak yang diperlukan untuk menjana lelaran yang perlu nilai.
Untuk mencerminkan kelebihan penjana, mari kita tentukan fungsi untuk perbandingan:
function func1() { foreach (range(0, 1000000) as $value){ echo $value; } } func1(); // ( ! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 402653192 bytes) in xxx.php on line 5
Oleh kerana tatasusunan yang begitu besar dicipta ke dalam memori untuk lelaran, PHP secara langsung menggesa bahawa ia melebihi satu Had memori proses.
Mari beralih kepada kaedah penjana:
function func1() { foreach (range(0, 1000000) as $value){ yield $value; } } var_dump(func1()); // object(Generator)[1] foreach (func1() as $value){ echo $value; }
Anda boleh melihat bahawa kami memanggil func1() dan mengembalikan objek Penjana Objek ini boleh diulang menggunakan foreach, setiap lelaran, PHP akan minta instance Generator untuk mengira dan menyediakan nilai seterusnya untuk diulang.
Keanggunan penjana ialah setiap kali ia menghasilkan nilai, keadaan dalaman penjana akan berhenti seketika
Keadaan dalaman akan dipulihkan apabila nilai seterusnya diminta daripada penjana; . Keadaan dalaman penjana bertukar antara jeda dan sambung semula sehingga akhir definisi fungsi dicapai atau kenyataan pulangan kosong ditemui.
[Pembelajaran yang disyorkan: Tutorial video PHP]