Selamat datang di Part 74 dari seri tutorial pemrograman PHP! Di bagian ini, kita akan menyelami konsep PHP Generators. Generators memungkinkan kita untuk melakukan iterasi melalui data yang sangat besar tanpa harus memuat seluruh data ke dalam memori sekaligus. Ini sangat penting untuk meningkatkan efisiensi dan kinerja aplikasi kita. Sebagai prasyarat, Anda sebaiknya sudah familiar dengan konsep iterasi (looping) dan PHP Reflection yang sudah kita bahas sebelumnya di part 73: PHP Reflection - Membongkar Struktur Kelas Secara Dinamis.
Bayangkan Anda memiliki buku dengan sejuta halaman. Membaca seluruh buku sekaligus akan sangat memakan waktu dan tenaga (mirip dengan memuat seluruh data ke memori). Dengan Generator, Anda seperti memiliki pembaca yang cerdas yang hanya membacakan satu halaman setiap kali Anda memintanya. Setelah Anda selesai dengan halaman itu, dia berhenti sampai Anda memintanya lagi. Dengan kata lain, Generator menghasilkan nilai satu per satu (on-demand) daripada menghasilkan seluruh kumpulan nilai sekaligus.
Dalam PHP, Generator adalah fungsi yang menggunakan keyword yield. Keyword ini berfungsi seperti return, tetapi alih-alih menghentikan fungsi, yield menghentikan eksekusi fungsi sementara dan mengembalikan sebuah nilai. Fungsi tersebut kemudian dapat dilanjutkan dari titik terakhir kali ia berhenti.
Mari kita lihat contoh kode sederhana untuk memahami cara kerja Generator:
<?php
function angkaGenap(int $max):
Generator
{
for ($i = 0; $i <= $max; $i++) {
if ($i % 2 === 0) {
yield $i;
}
}
}
// Menggunakan Generator
$genap = angkaGenap(10);
foreach ($genap as $angka) {
echo $angka . " "; // Output: 0 2 4 6 8 10
}
Penjelasan Kode:
function angkaGenap(int $max): Generator: Mendefinisikan fungsi angkaGenap yang menerima satu parameter integer $max dan mengembalikan sebuah objek Generator.for ($i = 0; $i <= $max; $i++): Melakukan iterasi dari 0 hingga $max.if ($i % 2 === 0): Memeriksa apakah angka $i adalah genap.yield $i: Jika angka genap, mengembalikan angka tersebut menggunakan yield. Fungsi berhenti di sini dan menunggu panggilan berikutnya.$genap = angkaGenap(10): Membuat instance Generator dengan memanggil fungsi angkaGenap.foreach ($genap as $angka): Melakukan iterasi melalui Generator dan mencetak setiap angka genap.Generator sangat berguna untuk membaca file yang sangat besar baris demi baris tanpa memuat seluruh file ke dalam memori:
<?php
function bacaBarisFile(string $namaFile):
Generator
{
$handle = fopen($namaFile, 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
yield $line;
}
fclose($handle);
}
}
// Menggunakan Generator untuk membaca file
$file = bacaBarisFile('data.txt');
foreach ($file as $baris) {
echo $baris;
}
Penjelasan Kode:
function bacaBarisFile(string $namaFile): Generator: Mendefinisikan fungsi bacaBarisFile yang menerima nama file dan mengembalikan Generator.$handle = fopen($namaFile, 'r'): Membuka file dalam mode baca.while (($line = fgets($handle)) !== false): Membaca file baris demi baris.yield $line: Mengembalikan setiap baris menggunakan yield.fclose($handle): Menutup file setelah selesai dibaca.yield: Jika Anda tidak menggunakan yield di dalam fungsi, fungsi tersebut tidak akan menjadi Generator.yield: Pastikan Anda menghasilkan nilai secara bertahap daripada memuat seluruh data ke memori sebelum menggunakan yield.Buatlah sebuah Generator yang menghasilkan bilangan Fibonacci hingga angka tertentu. Misalnya, jika batasnya adalah 10, Generator harus menghasilkan: 0, 1, 1, 2, 3, 5, 8.