Menu Navigasi

Tutorial Tutorial Pemrograman Part 68: PHP Generators - Iterasi Memori Efisien

AI Generated
30 Desember 2025
15 views
Tutorial Tutorial Pemrograman Part 68: PHP Generators - Iterasi Memori Efisien

Pendahuluan

Selamat datang di Part 68 dari seri tutorial Tutorial Pemrograman kita! Di part ini, kita akan menyelami konsep PHP Generators. Generators memungkinkan kita untuk menulis kode yang melakukan iterasi data secara efisien, terutama ketika berurusan dengan dataset yang besar. Bayangkan jika kita harus memproses file log berukuran gigabyte. Memuat seluruh file ke dalam memori akan sangat boros. Generators hadir untuk mengatasi masalah ini.

Prasyarat: Sebelum memulai, pastikan Anda familiar dengan dasar-dasar PHP dan konsep iterasi (loop).

Konsep Dasar

Apa itu Generator? Generator adalah fungsi yang menghasilkan nilai secara bertahap (yields) alih-alih mengembalikan satu nilai sekaligus. Setiap kali `yield` dipanggil, fungsi generator menangguhkan eksekusinya dan mengembalikan nilai yang dihasilkan. Ketika generator diiterasi lagi, eksekusi dilanjutkan dari titik terakhir. Ini berbeda dengan fungsi biasa yang mengembalikan nilai tunggal dan selesai.

Analogi Dunia Nyata: Bayangkan pabrik permen. Alih-alih memproduksi semua permen sekaligus dan menumpuknya, pabrik menghasilkan permen satu per satu sesuai permintaan. Generator bekerja seperti itu: ia hanya menghasilkan nilai saat dibutuhkan.

Hands-on Coding

Contoh 1: Generator Sederhana

<?php
function angkaGenerator(int $max):
Generator
{
    for ($i = 1; $i <= $max; $i++) {
        yield $i;
    }
}

$generator = angkaGenerator(5);

foreach ($generator as $angka) {
    echo $angka . " <br>";
}
?>

Penjelasan Kode:

  • function angkaGenerator(int $max): Generator: Mendefinisikan fungsi generator bernama angkaGenerator yang menerima satu argumen integer $max dan mengembalikan objek Generator.
  • for ($i = 1; $i <= $max; $i++): Loop yang berjalan dari 1 hingga $max.
  • yield $i: Menghasilkan nilai $i. Fungsi menangguhkan eksekusi di sini dan mengembalikan nilai tersebut. Ketika loop berlanjut, eksekusi dilanjutkan dari titik ini.
  • $generator = angkaGenerator(5): Membuat instance generator dengan memanggil fungsi angkaGenerator dengan nilai 5.
  • foreach ($generator as $angka): Melakukan iterasi melalui generator. Setiap kali loop berjalan, generator menghasilkan nilai berikutnya.
  • echo $angka . " <br>": Mencetak nilai yang dihasilkan.

Contoh 2: Membaca File Besar dengan Generator

<?php
function bacaBarisPerBaris(string $file):
Generator
{
    $handle = fopen($file, 'r');
    if (!$handle) {
        throw new Exception("Tidak dapat membuka file.");
    }

    while (($line = fgets($handle)) !== false) {
        yield $line;
    }

    fclose($handle);
}

$file = 'large_file.txt'; // Ganti dengan nama file Anda

try {
    foreach (bacaBarisPerBaris($file) as $baris) {
        echo $baris;
        // Lakukan sesuatu dengan setiap baris
    }
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

Penjelasan Kode:

  • function bacaBarisPerBaris(string $file): Generator: Mendefinisikan fungsi generator yang menerima path file sebagai argumen.
  • $handle = fopen($file, 'r'): Membuka file untuk dibaca.
  • while (($line = fgets($handle)) !== false): Membaca file baris per baris.
  • yield $line: Menghasilkan setiap baris file.
  • fclose($handle): Menutup file setelah selesai dibaca.
  • Blok try...catch digunakan untuk menangani pengecualian jika file tidak dapat dibuka.

Common Pittfalls

  • Lupa Tipe Data yang Dikembalikan: Pastikan untuk mendeklarasikan tipe kembalian fungsi generator sebagai Generator.
  • Mengakses File di Luar Generator: Hindari membuka dan menutup file di luar generator jika file sangat besar, karena generator dimaksudkan untuk memprosesnya secara bertahap.
  • Penggunaan Memori yang Tidak Tepat: Meskipun generator efisien memori, tetap perhatikan operasi yang Anda lakukan pada setiap nilai yang dihasilkan. Operasi yang kompleks masih dapat memakan banyak memori.

Challenge

Buatlah generator yang menghasilkan bilangan Fibonacci hingga nilai tertentu.

Sumber Referensi

Bagikan: