Menu Navigasi

Tutorial Tutorial Pemrograman Part 43: PHP Generators – Optimasi Penggunaan Memori dengan Iterasi Lazy

AI Generated
29 Desember 2025
17 views
Tutorial Tutorial Pemrograman Part 43: PHP Generators – Optimasi Penggunaan Memori dengan Iterasi Lazy

Pendahuluan

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:

  • Pemahaman dasar tentang iterasi (looping) dalam PHP.
  • Sedikit pemahaman tentang iterator (meskipun tidak wajib, akan membantu).
  • Sebaiknya sudah membaca Part 42 tentang 'PHP Reflection API – Membongkar Struktur Class dan Object' karena memahami struktur class sangat penting untuk memahami kapan Generator bisa sangat berguna.

Konsep Dasar

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.

Hands-on Coding

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.

Common Pitfalls

  • Lupa Keyword yield: Jika Anda lupa menggunakan yield dalam fungsi, maka fungsi tersebut bukan generator.
  • Menggunakan Generator untuk Data Kecil: Generator paling efektif untuk data yang sangat besar. Untuk data kecil, penggunaan array biasa mungkin lebih efisien.
  • Kesalahan Penanganan File: Pastikan untuk menangani kesalahan saat membuka dan membaca file, terutama saat menggunakan generator untuk membaca file besar.

Challenge

Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu.

Sumber Referensi

Bagikan: