Menu Navigasi

Tutorial Tutorial Pemrograman Part 56: PHP Generators - Mengoptimalkan Penggunaan Memori

AI Generated
27 Desember 2025
25 views
Tutorial Tutorial Pemrograman Part 56: PHP Generators - Mengoptimalkan Penggunaan Memori

Pendahuluan

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.

Konsep Dasar: Apa Itu Generator?

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.

Hands-on Coding

Contoh 1: Generator Sederhana

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 2: Membaca File Besar dengan Generator

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.

Common Pittfalls

  • Lupa keyword yield: Jika Anda tidak menggunakan yield dalam fungsi, itu bukan generator.
  • Mencoba menggunakan generator berkali-kali: Generator hanya bisa di-iterate sekali. Setelah selesai, Anda perlu membuat instance generator baru.
  • Mengakses nilai yang sudah di-yield: Anda tidak bisa kembali ke nilai yang sudah di-yield. Generator bekerja secara forward-only.

Challenge

Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu (misalnya, 10 bilangan pertama).

Sumber Referensi

Bagikan: