Selamat datang di part 73 seri tutorial pemrograman PHP! Kali ini, kita akan menyelami konsep Generators. Generators memungkinkan kita untuk membuat iterator tanpa harus menyimpan seluruh data dalam memori sekaligus. Ini sangat berguna ketika kita bekerja dengan dataset besar atau aliran data yang tak terbatas. Prasyarat untuk tutorial ini adalah pemahaman dasar tentang iterator dan penggunaan yield.
Artikel ini melanjutkan pembahasan sebelumnya tentang 'PHP Reflection - Mengintip dan Memanipulasi Struktur Kode'. Meskipun Reflection dan Generators memiliki fungsi yang berbeda, keduanya adalah fitur tingkat lanjut yang membantu kita menulis kode PHP yang lebih efisien dan fleksibel.
Bayangkan Anda memiliki file log berukuran gigabyte dan Anda ingin membaca setiap barisnya. Jika Anda membaca seluruh file ke dalam array, memori Anda akan cepat habis. Di sinilah Generators berperan. Generators seperti 'tukang bagi' yang hanya memberikan satu potong data setiap kali diminta. Mereka 'menghasilkan' (yield) nilai satu per satu, alih-alih menghasilkan seluruh koleksi sekaligus.
Secara teknis, sebuah Generator adalah sebuah fungsi yang menggunakan keyword yield. Ketika fungsi Generator dipanggil, ia tidak langsung mengeksekusi kodenya. Sebaliknya, ia mengembalikan sebuah objek yang dapat diiterasi. Setiap kali kita mengiterasi objek tersebut, fungsi akan dieksekusi hingga menemukan keyword yield. Nilai yang dihasilkan oleh yield akan dikembalikan, dan eksekusi fungsi akan ditunda sampai iterasi berikutnya.
Mari kita buat generator sederhana yang menghasilkan angka dari 1 hingga 5:
Penjelasan:
angkaGenerator(int $max): Sebuah fungsi generator yang menerima angka maksimal sebagai argumen. Tanda return type Generator mengindikasikan bahwa fungsi tersebut adalah sebuah generatoryield $i: Menghasilkan nilai $i saat iterasi.foreach: Mengiterasi objek generator dan mencetak setiap angka.Anda juga bisa menghasilkan key-value pairs dengan generator, mirip dengan array asosiatif:
'Merah';
yield 'pisang' => 'Kuning';
yield 'jeruk' => 'Oranye';
}
foreach (buahGenerator() as $buah => $warna) {
echo "$buah berwarna $warna
";
}
// Output:
// apel berwarna Merah
// pisang berwarna Kuning
// jeruk berwarna Oranye
?>
Contoh paling umum penggunaan generator adalah untuk membaca file besar baris per baris tanpa memuat seluruh file ke memori:
getMessage();
}
?>
Pastikan Anda memiliki file bernama large_file.txt di direktori yang sama dengan script PHP Anda, atau sesuaikan path $namaFile.
yield: Jika Anda membuat fungsi yang dimaksudkan sebagai generator tetapi lupa menggunakan yield, fungsi tersebut tidak akan menjadi generator dan mungkin berperilaku tidak terduga.finally untuk menangani pengecualian. Namun dalam contoh diatas, file langsung ditutup setelah iterasi selesai.Buat sebuah generator yang menghasilkan bilangan Fibonacci hingga angka tertentu. Misalnya, jika input adalah 10, generator harus menghasilkan urutan: 0, 1, 1, 2, 3, 5, 8.