Selamat datang di Part 43 dari seri Tutorial Pemrograman kita! Di part ini, kita akan menyelami dunia PHP Generators, sebuah fitur yang sangat berguna untuk mengoptimalkan penggunaan memori dalam iterasi data yang besar. Generator memungkinkan kita untuk menghasilkan nilai secara bertahap, hanya ketika dibutuhkan, daripada menyimpan seluruh data dalam memori sekaligus.
Prasyarat:
Bayangkan Anda sedang membuat roti. Cara biasa adalah Anda menyiapkan semua bahan, menguleni adonan, memanggang semua roti sekaligus, dan kemudian menyimpannya. Generator, di sisi lain, seperti membuat roti satu per satu sesuai permintaan. Anda hanya menyiapkan adonan dan memanggang satu roti ketika ada yang memesan. Ini menghemat ruang (memori) karena Anda tidak perlu menyimpan banyak roti sekaligus.
Dalam PHP, generator adalah fungsi yang menggunakan keyword yield. Ketika fungsi generator dipanggil, ia tidak langsung mengeksekusi kode di dalamnya. Sebaliknya, ia mengembalikan sebuah object iterator. Setiap kali Anda melakukan iterasi pada object iterator ini, fungsi generator akan dieksekusi hingga menemukan keyword yield. Nilai setelah yield akan dikembalikan, dan eksekusi fungsi generator akan ditunda sampai iterasi berikutnya.
Mari kita lihat contoh sederhana:
<?php
function angkaGenerator(int $max):
Generator
{
for ($i = 1; $i <= $max; $i++) {
yield $i;
}
}
$angka = angkaGenerator(5);
foreach ($angka as $nilai) {
echo "Nilai: " . $nilai . "<br>";
}
?>
Penjelasan:
function angkaGenerator(int $max): Generator: Mendefinisikan sebuah fungsi generator yang menerima parameter $max (batas atas) dan mengembalikan object Generator.for ($i = 1; $i <= $max; $i++): Sebuah loop yang berjalan dari 1 hingga $max.yield $i;: Keyword yield mengembalikan nilai $i dan menunda eksekusi fungsi.$angka = angkaGenerator(5);: Memanggil fungsi generator dengan nilai 5. Ini tidak langsung mengeksekusi fungsi, melainkan mengembalikan object iterator.foreach ($angka as $nilai): Melakukan iterasi pada object iterator. Setiap iterasi akan menjalankan fungsi generator hingga menemukan yield, mengembalikan nilai, dan menunda eksekusi.Contoh penggunaan generator untuk membaca file besar baris per baris:
<?php
function bacaFilePerBaris(string $namaFile):
Generator
{
$file = fopen($namaFile, 'r');
if ($file) {
while (($baris = fgets($file)) !== false) {
yield $baris;
}
fclose($file);
}
}
$namaFile = 'data_besar.txt'; // Gantilah dengan nama file Anda
foreach (bacaFilePerBaris($namaFile) as $baris) {
echo $baris;
}
?>
Penjelasan:
function bacaFilePerBaris(string $namaFile): Generator: Mendefinisikan fungsi generator yang menerima nama file dan mengembalikan object Generator.$file = fopen($namaFile, 'r');: Membuka file untuk dibaca.while (($baris = fgets($file)) !== false): Membaca file baris per baris menggunakan fgets().yield $baris;: Mengembalikan baris yang dibaca dan menunda eksekusi fungsi.fclose($file);: Menutup file setelah selesai dibaca.foreach (bacaFilePerBaris($namaFile) as $baris): Melakukan iterasi pada setiap baris yang dihasilkan oleh generator.yield: Jika Anda lupa menggunakan yield dalam fungsi, maka fungsi tersebut bukan generator.Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu.