Selamat datang di Part 56 dari seri tutorial pemrograman PHP lengkap! Pada bagian ini, kita akan menyelami konsep generators dalam PHP. Generators adalah cara ampuh untuk mengoptimalkan penggunaan memori, terutama saat bekerja dengan dataset yang besar. Jika Anda pernah mengalami masalah memori saat memproses file besar atau database yang luas, generators adalah solusi yang tepat.
Prasyarat: Anda diharapkan sudah memahami dasar-dasar PHP, termasuk fungsi, iterasi (for, foreach), dan array. Sebaiknya juga telah memahami konsep dasar dari tutorial sebelumnya tentang Membangun RESTful API dengan Lumen Framework, karena dalam pengembangan API, efisiensi memori sangat penting.
Bayangkan Anda memiliki sebuah pabrik yang menghasilkan mainan. Cara tradisional adalah pabrik tersebut memproduksi semua mainan sekaligus, lalu menyimpannya di gudang sebelum didistribusikan. Gudang ini merepresentasikan memori. Jika pabrik menghasilkan banyak mainan, gudang akan penuh dan membutuhkan biaya besar.
Generator bekerja berbeda. Alih-alih menghasilkan semua nilai sekaligus, generator menghasilkan nilai satu per satu, saat dibutuhkan. Jadi, pabrik (generator) hanya memproduksi satu mainan (nilai) ketika ada permintaan (iterasi), dan setelah mainan dikirim, 'gudang' (memori) tetap kosong. Ini sangat efisien untuk dataset besar.
Secara teknis, generator adalah fungsi yang menggunakan keyword yield. Ketika fungsi generator dipanggil, ia tidak langsung mengeksekusi kode di dalamnya. Ia mengembalikan sebuah objek yang bisa di-iterate. Setiap kali Anda melakukan iterasi pada objek tersebut, fungsi generator dijalankan sampai menemukan keyword yield. Nilai yang di-yield dikembalikan, dan fungsi di-pause. Fungsi akan dilanjutkan saat iterasi berikutnya.
Contoh ini menunjukkan bagaimana generator menghasilkan urutan angka:
<?php
function angkaGenerator(int $batas)
{
for ($i = 1; $i <= $batas; $i++) {
yield $i;
}
}
$angka = angkaGenerator(5);
foreach ($angka as $n) {
echo $n . " "; // Output: 1 2 3 4 5
}
?>
Penjelasan:
function angkaGenerator(int $batas): Mendefinisikan fungsi generator yang menerima batas atas sebagai input.for ($i = 1; $i <= $batas; $i++): Melakukan iterasi dari 1 hingga batas yang ditentukan.yield $i: Menghasilkan nilai $i. Fungsi akan berhenti di sini dan melanjutkan saat iterasi berikutnya.$angka = angkaGenerator(5): Membuat objek generator.foreach ($angka as $n): Melakukan iterasi pada objek generator dan mencetak setiap nilai yang dihasilkan.Contoh ini membaca file CSV besar baris demi baris tanpa memuat seluruh file ke dalam memori:
<?php
function bacaCsv(string $namaFile)
{
$file = fopen($namaFile, 'r');
if ($file) {
while (($baris = fgetcsv($file)) !== false) {
yield $baris;
}
fclose($file);
}
}
$data = bacaCsv('data_besar.csv');
foreach ($data as $baris) {
// Proses setiap baris data
print_r($baris);
}
?>
Penjelasan:
function bacaCsv(string $namaFile): Mendefinisikan fungsi generator yang menerima nama file sebagai input.$file = fopen($namaFile, 'r'): Membuka file dalam mode baca.while (($baris = fgetcsv($file)) !== false): Membaca file baris demi baris menggunakan fgetcsv.yield $baris: Menghasilkan baris data.fclose($file): Menutup file setelah selesai dibaca.$data = bacaCsv('data_besar.csv'): Membuat objek generator.foreach ($data as $baris): Melakukan iterasi pada objek generator dan memproses setiap baris data.yield: Jika Anda tidak menggunakan yield dalam fungsi, itu bukan generator.Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu (misalnya, 10 bilangan pertama).