Menu Navigasi

Tutorial Tutorial Pemrograman Part 52: PHP Generators - Lazy Evaluation for Efficient Iteration

AI Generated
28 Desember 2025
17 views
Tutorial Tutorial Pemrograman Part 52: PHP Generators - Lazy Evaluation for Efficient Iteration

Pendahuluan

Selamat datang di part 52 dari seri tutorial Tutorial Pemrograman! Di part ini, kita akan menyelami dunia PHP Generators. Generators memungkinkan kita untuk menulis kode yang lebih efisien memori, terutama saat berurusan dengan data yang sangat besar. Sebelumnya kita telah membahas PHP Traits (Part 51), yang berfokus pada penggunaan kembali kode. Generators, di sisi lain, berfokus pada optimalisasi performa dan penggunaan memori.

Prasyarat:

  • Pemahaman dasar tentang fungsi dan iterasi di PHP.

Konsep Dasar

Bayangkan Anda perlu memproses file log berukuran gigabyte. Membaca seluruh file ke dalam memori sekaligus akan sangat memakan sumber daya. Di sinilah Generators berperan. Generator adalah fungsi khusus yang dapat dihentikan dan dilanjutkan (paused & resumed), memungkinkan Anda untuk menghasilkan nilai satu per satu sesuai permintaan (on-demand), bukan semuanya sekaligus. Ini dikenal sebagai lazy evaluation.

Analogi Dunia Nyata: Pertimbangkan sebuah pabrik permen. Pabrik permen tradisional memproduksi seluruh batch permen sebelum didistribusikan. Pabrik permen Generator, di sisi lain, hanya memproduksi permen saat ada permintaan. Ini lebih efisien jika permintaan permen bervariasi.

Hands-on Coding

Contoh 1: Generator Sederhana

<?php
function numberGenerator(int $start, int $end, int $step = 1)
{
 for ($i = $start; $i <= $end; $i += $step) {
 yield $i;
 }
}

$generator = numberGenerator(1, 10);

foreach ($generator as $number) {
 echo $number . " ";
}

// Output: 1 2 3 4 5 6 7 8 9 10

Penjelasan:

  • `function numberGenerator(int $start, int $end, int $step = 1)`: Mendefinisikan fungsi generator yang menerima nilai awal, akhir, dan langkah (opsional).
  • `for ($i = $start; $i <= $end; $i += $step)`: Melakukan iterasi dari nilai awal hingga akhir.
  • `yield $i`: Kata kunci `yield` adalah inti dari generator. Alih-alih `return`, `yield` menghasilkan nilai saat ini ($i) dan menunda eksekusi fungsi.
  • `$generator = numberGenerator(1, 10)`: Membuat instance dari generator. Perhatikan bahwa kode di dalam fungsi generator *belum* dieksekusi.
  • `foreach ($generator as $number)`: Saat kita melakukan iterasi menggunakan `foreach`, fungsi generator dieksekusi hingga `yield` berikutnya. Setiap nilai yang dihasilkan (`yield`) ditetapkan ke `$number`.

Contoh 2: Membaca File dengan Generator

<?php
function readFileLineByLine(string $filename):
 Generator
{
 $file = fopen($filename, 'r');

 if (!$file) {
 throw new Exception('Tidak dapat membuka file: ' . $filename);
 }

 while (!feof($file)) {
 yield fgets($file);
 }

 fclose($file);
}

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

 try {
 foreach (readFileLineByLine($filename) as $line) {
 // Proses setiap baris di sini
 echo $line;
 }
 } catch (Exception $e) {
 echo 'Error: ' . $e->getMessage() . "\n";
 }

Penjelasan:

  • `function readFileLineByLine(string $filename): Generator`: Mendefinisikan generator yang membaca file baris demi baris.
  • `$file = fopen($filename, 'r')`: Membuka file dalam mode baca.
  • `while (!feof($file))`: Melakukan iterasi selama belum mencapai akhir file.
  • `yield fgets($file)`: Membaca satu baris dari file dan menghasilkan (yield) baris tersebut.
  • `fclose($file)`: Menutup file setelah selesai.
  • Try/catch block untuk menangani jika file tidak ada.

Dengan menggunakan generator, kita hanya memuat satu baris file ke dalam memori pada satu waktu, sehingga sangat efisien untuk file besar.

Common Pittfalls

  • Lupa Kata Kunci `yield`: Tanpa `yield`, fungsi bukan generator.
  • Mencoba Me-rewind Generator yang Sudah Selesai: Generator hanya dapat diiterasi sekali. Setelah selesai menghasilkan nilai, generator tidak dapat direset.
  • Tidak Menutup File di Generator: Pastikan untuk menutup file atau sumber daya lain yang Anda buka di dalam generator untuk menghindari kebocoran memori.

Challenge

Buat generator yang menghasilkan bilangan Fibonacci hingga batas tertentu. Gunakan generator untuk mencetak 20 bilangan Fibonacci pertama.

Sumber Referensi

Bagikan: