Menu Navigasi

Tutorial Tutorial Pemrograman Part 57: PHP Generators untuk Iterasi Memory-Efficient

AI Generated
29 Desember 2025
17 views
Tutorial Tutorial Pemrograman Part 57: PHP Generators untuk Iterasi Memory-Efficient

Pendahuluan

Selamat datang di part 57 dari seri tutorial Tutorial Pemrograman! Pada bagian ini, kita akan membahas tentang PHP Generators. Generators adalah cara sederhana dan efisien untuk membuat iterator, yang memungkinkan kita melakukan iterasi melalui kumpulan data besar tanpa memuat semuanya ke dalam memori sekaligus. Ini sangat berguna ketika kita bekerja dengan file besar, hasil kueri database yang besar, atau data streaming. Prasyarat untuk tutorial ini adalah pemahaman dasar tentang iterator di PHP dan konsep pemrograman asynchronous yang telah kita bahas di Part 56: PHP Asynchronous Programming dengan ReactPHP. Generators sangat berguna dalam konteks asynchronous programming untuk memproses data secara bertahap.

Konsep Dasar

Bayangkan Anda memiliki sebuah buku yang sangat tebal. Alih-alih membaca seluruh buku sekaligus (yang akan memakan banyak waktu dan energi), Anda membacanya bab per bab. Setiap kali Anda selesai membaca sebuah bab, Anda baru melanjutkan ke bab berikutnya. Generators bekerja mirip dengan ini. Mereka menghasilkan nilai satu per satu, hanya ketika diminta, daripada membuat seluruh koleksi nilai di awal. Kata kunci utama dalam generators adalah yield.

Secara teknis, generator adalah sebuah fungsi yang mengembalikan iterator. Ketika fungsi generator dipanggil, ia tidak menjalankan kode fungsi secara langsung. Sebaliknya, ia mengembalikan sebuah objek yang dapat diiterasi. Setiap kali yield dipanggil dalam fungsi generator, eksekusi fungsi dihentikan, dan nilai yang di-yield dikembalikan ke kode yang memanggil. Ketika iterasi berlanjut, eksekusi fungsi generator dilanjutkan dari titik terakhirnya.

Hands-on Coding

Mari kita lihat contoh sederhana untuk memahami bagaimana generators bekerja.

Contoh 1: Generator Sederhana

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

$numbers = numberGenerator(1, 5);

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

// Output: 1 2 3 4 5

?>

Penjelasan:

  • numberGenerator adalah fungsi generator yang menerima dua parameter: $start dan $end.
  • Di dalam loop for, kita menggunakan kata kunci yield untuk menghasilkan setiap angka dari $start hingga $end.
  • Ketika numberGenerator dipanggil, ia mengembalikan sebuah objek generator, yang kemudian kita iterasi menggunakan foreach.
  • Setiap kali iterasi foreach meminta nilai berikutnya dari generator, fungsi numberGenerator dilanjutkan dari titik terakhirnya (yield).

Contoh 2: Membaca File Besar dengan Generator

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

 while ($line = fgets($file)) {
 yield $line;
 }

 fclose($file);
}

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

try {
 foreach (readFileLines($filename) as $line) {
 echo $line;
 // Proses setiap baris file
 }
} catch (Exception $e) {
 echo "Error: " . $e->getMessage();
}

?>

Penjelasan:

  • readFileLines adalah fungsi generator yang membaca file baris per baris.
  • fopen membuka file dalam mode baca ('r').
  • Loop while membaca setiap baris dari file menggunakan fgets dan kemudian menggunakan yield untuk menghasilkan baris tersebut.
  • File ditutup menggunakan fclose setelah selesai dibaca.
  • Dengan menggunakan generator, kita hanya memuat satu baris file ke dalam memori pada satu waktu, sehingga kita dapat memproses file besar tanpa kehabisan memori.

Contoh 3: Generators dengan Keys

<?php
function keyGenerator():
Generator
{
 yield 'a' => 1;
 yield 'b' => 2;
 yield 'c' => 3;
}

foreach (keyGenerator() as $key => $value) {
 echo "Key: " . $key . ", Value: " . $value . "\n";
}

// Output:
// Key: a, Value: 1
// Key: b, Value: 2
// Key: c, Value: 3
?>

Penjelasan:

  • Generator dapat juga menghasilkan nilai dengan key, mirip array assosiatif.
  • Dalam contoh ini, setiap `yield` menghasilkan pasangan key-value.
  • Loop `foreach` kemudian dapat mengiterasi key dan value secara terpisah.

Common Pittfalls

  • Lupa Kata Kunci yield: Jika Anda lupa menggunakan yield, fungsi Anda tidak akan menjadi generator.
  • Kesalahan Menangani Resource: Pastikan untuk menutup file atau resource lain yang Anda gunakan dalam generator. Gunakan blok try...finally untuk memastikan resource selalu dibebaskan, bahkan jika terjadi pengecualian.
  • Menggunakan Generator untuk Data Kecil: Generators paling bermanfaat untuk data besar. Untuk data kecil, menggunakan array mungkin lebih sederhana dan efisien.

Challenge

Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga angka tertentu. Misalnya, jika input adalah 10, generator harus menghasilkan 0, 1, 1, 2, 3, 5, 8.

Sumber Referensi

Bagikan: