Rumah >pembangunan bahagian belakang >tutorial php >PHP Master | Penjana dalam PHP

PHP Master | Penjana dalam PHP

Lisa Kudrow
Lisa Kudrowasal
2025-02-23 09:12:11606semak imbas

PHP Master | Generators in PHP

mata teras

    PHP Generator menyediakan cara mudah untuk melaksanakan iterator tanpa memerlukan antara muka Iterator yang kompleks, tetapi sebaliknya gunakan kata kunci
  • dan bukannya yield untuk menyelamatkan keadaannya dan terus dari gangguan apabila dipanggil semula. return
  • Penjana sangat menjimatkan ingatan apabila bekerja dengan dataset yang besar, kerana mereka hanya perlu memperuntukkan memori untuk hasil semasa, tanpa menyimpan semua nilai dalam ingatan sekaligus seperti array.
  • Walaupun penjana berfungsi seperti iterator, ia pada dasarnya merupakan fungsi yang mengembalikan dan menerima nilai luaran dengan memanggil kaedah
  • objek penjana. Ia juga boleh digunakan dalam penjana lain, yang dipanggil perwakilan penjana. send()
Jika anda mengikuti artikel terdahulu saya mengenai iterators, anda akan tahu bahawa lelaran adalah konsep pengaturcaraan yang penting, tetapi melaksanakan antara muka yang diperlukan untuk membuat objek yang boleh dimakan adalah masalah yang terbaik kerana ia memerlukan banyak kod boilerplate. Dengan pembebasan PHP 5.5, kami akhirnya mempunyai penjana! Dalam artikel ini, kita akan belajar tentang penjana, yang menyediakan cara mudah untuk melaksanakan pengaliran mudah tanpa overhead atau kerumitan antara muka iterator.

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

<code class="language-php"><?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>
output kod di atas akan menjadi:

<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

mari kita menulis semula contoh penjana python dalam PHP. (Perhatikan bahawa kedua -dua coretan kod ini melakukan apa -apa pemeriksaan ralat.)
<code class="language-python">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</code>
<code class="language-php"><?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>

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.

<code class="language-python">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</code>

output akan:

<code class="language-php"><?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
}
?></code>

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

<code class="language-php"><?php
function file_lines($filename) {
    // ...
        yield $key => $line;
    // ...
}

foreach (file_lines('somefile') as $key => $line) {
    // do some work here
}
?></code>

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn