Menu Navigasi

Tutorial Tutorial Pemrograman Part 65: PHP Generators - Lazy Evaluation untuk Efisiensi Memori

AI Generated
27 Desember 2025
23 views
Tutorial Tutorial Pemrograman Part 65: PHP Generators - Lazy Evaluation untuk Efisiensi Memori

Pendahuluan

Selamat datang kembali di seri tutorial Tutorial Pemrograman! Di part sebelumnya, kita telah mempelajari tentang SplFileObject untuk manipulasi file tingkat lanjut. Sekarang, di part 65 ini, kita akan menjelajahi konsep yang sangat berguna untuk optimasi memori dalam PHP: Generators. Generators memungkinkan kita menghasilkan nilai secara bertahap (lazy evaluation), sehingga kita tidak perlu memuat seluruh data ke dalam memori sekaligus. Ini sangat berguna ketika kita berurusan dengan dataset yang besar atau operasi yang kompleks.

Prasyarat:

  • Pemahaman dasar tentang fungsi dan iterasi dalam PHP.
  • Pengetahuan tentang array dalam PHP (disarankan).
  • Direkomendasikan: Memahami tutorial sebelumnya tentang SplFileObject.

Konsep Dasar

Bayangkan Anda memiliki pabrik yang menghasilkan sejumlah besar mainan. Alih-alih membuat seluruh mainan dan menyimpannya di gudang, pabrik tersebut hanya membuat mainan sesuai permintaan. Inilah ide dasar dari generators dalam PHP. Generator adalah fungsi yang menghasilkan nilai satu per satu menggunakan kata kunci yield. Setiap kali yield dipanggil, fungsi akan 'berhenti sejenak' dan mengembalikan nilai tersebut. Ketika nilai berikutnya dibutuhkan, fungsi akan melanjutkan dari titik terakhir yield. Ini memungkinkan kita memproses data besar tanpa membebani memori.

Lazy Evaluation: Proses evaluasi ekspresi ditunda sampai nilainya benar-benar dibutuhkan. Generator memanfaatkan prinsip ini.

Hands-on Coding

Contoh 1: Generator Sederhana


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

$angka = angkaGenerator(5);

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

Penjelasan:

  • Fungsi angkaGenerator menerima sebuah integer $max sebagai parameter.
  • Loop for berjalan dari 1 hingga $max.
  • Kata kunci yield mengembalikan nilai $i setiap iterasi.
  • Perhatikan bahwa tipe kembalian fungsi adalah Generator
  • Loop foreach digunakan untuk mengiterasi nilai yang dihasilkan oleh generator.

Contoh 2: Membaca File Besar dengan Generator


<?php
function bacaBarisFile(string $namaFile):
 Generator
{
 $file = fopen($namaFile, 'r');
 if ($file) {
 while (($baris = fgets($file)) !== false) {
 yield $baris;
 }
 fclose($file);
 }
}

// Gantilah 'data_besar.txt' dengan nama file Anda
$data = bacaBarisFile('data_besar.txt');

foreach ($data as $baris) {
 echo $baris;
}
?>

Penjelasan:

  • Fungsi bacaBarisFile menerima nama file sebagai parameter.
  • Fungsi membuka file dalam mode baca ('r').
  • Loop while membaca setiap baris dari file menggunakan fgets.
  • Kata kunci yield mengembalikan setiap baris.
  • File ditutup setelah selesai dibaca.
  • Loop foreach digunakan untuk mengiterasi baris yang dihasilkan oleh generator.

Contoh 3: Generator dengan Kunci


<?php
function generatorDenganKunci(array $data):
 Generator
{
 foreach ($data as $kunci => $nilai) {
 yield $kunci => $nilai;
 }
}

$data = [
 'nama' => 'Budi',
 'usia' => 30,
 'pekerjaan' => 'Pengembang Web'
];

$generator = generatorDenganKunci($data);

foreach ($generator as $kunci => $nilai) {
 echo "$kunci: $nilai<br>";
}
?>

Penjelasan:

  • Fungsi generatorDenganKunci menerima array sebagai parameter.
  • Loop foreach mengiterasi setiap elemen array.
  • Kata kunci yield mengembalikan kunci dan nilai.
  • Loop foreach digunakan untuk mengiterasi kunci dan nilai yang dihasilkan oleh generator.

Common Pittfalls

  • Lupa Kata Kunci yield: Tanpa yield, fungsi tidak akan menjadi generator.
  • Memuat Data Terlalu Awal: Pastikan data hanya dimuat saat dibutuhkan oleh yield.
  • Tidak Menangani File dengan Benar: Pastikan file ditutup setelah digunakan untuk menghindari kebocoran sumber daya.
  • Salah Penggunaan Tipe Data: Pastikan tipe data yang di-yield sesuai dengan yang diharapkan oleh kode yang mengkonsumsi generator.

Challenge

Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu. Bilangan Fibonacci adalah deretan angka di mana angka berikutnya adalah jumlah dari dua angka sebelumnya (misalnya: 0, 1, 1, 2, 3, 5, 8...).

Sumber Referensi

Bagikan: