Menu Navigasi

Tutorial Tutorial Pemrograman Part 74: PHP Generators - Iterasi Efisien dengan Yield

AI Generated
30 Desember 2025
21 views
Tutorial Tutorial Pemrograman Part 74: PHP Generators - Iterasi Efisien dengan Yield

Pendahuluan

Selamat datang di Part 74 dari seri tutorial pemrograman PHP! Di bagian ini, kita akan menyelami konsep PHP Generators. Generators memungkinkan kita untuk melakukan iterasi melalui data yang sangat besar tanpa harus memuat seluruh data ke dalam memori sekaligus. Ini sangat penting untuk meningkatkan efisiensi dan kinerja aplikasi kita. Sebagai prasyarat, Anda sebaiknya sudah familiar dengan konsep iterasi (looping) dan PHP Reflection yang sudah kita bahas sebelumnya di part 73: PHP Reflection - Membongkar Struktur Kelas Secara Dinamis.

Konsep Dasar

Bayangkan Anda memiliki buku dengan sejuta halaman. Membaca seluruh buku sekaligus akan sangat memakan waktu dan tenaga (mirip dengan memuat seluruh data ke memori). Dengan Generator, Anda seperti memiliki pembaca yang cerdas yang hanya membacakan satu halaman setiap kali Anda memintanya. Setelah Anda selesai dengan halaman itu, dia berhenti sampai Anda memintanya lagi. Dengan kata lain, Generator menghasilkan nilai satu per satu (on-demand) daripada menghasilkan seluruh kumpulan nilai sekaligus.

Dalam PHP, Generator adalah fungsi yang menggunakan keyword yield. Keyword ini berfungsi seperti return, tetapi alih-alih menghentikan fungsi, yield menghentikan eksekusi fungsi sementara dan mengembalikan sebuah nilai. Fungsi tersebut kemudian dapat dilanjutkan dari titik terakhir kali ia berhenti.

Hands-on Coding

Mari kita lihat contoh kode sederhana untuk memahami cara kerja Generator:

<?php

function angkaGenap(int $max):
Generator
{
 for ($i = 0; $i <= $max; $i++) {
 if ($i % 2 === 0) {
 yield $i;
 }
 }
}

// Menggunakan Generator
$genap = angkaGenap(10);

foreach ($genap as $angka) {
 echo $angka . " "; // Output: 0 2 4 6 8 10
}

Penjelasan Kode:

  • function angkaGenap(int $max): Generator: Mendefinisikan fungsi angkaGenap yang menerima satu parameter integer $max dan mengembalikan sebuah objek Generator.
  • for ($i = 0; $i <= $max; $i++): Melakukan iterasi dari 0 hingga $max.
  • if ($i % 2 === 0): Memeriksa apakah angka $i adalah genap.
  • yield $i: Jika angka genap, mengembalikan angka tersebut menggunakan yield. Fungsi berhenti di sini dan menunggu panggilan berikutnya.
  • $genap = angkaGenap(10): Membuat instance Generator dengan memanggil fungsi angkaGenap.
  • foreach ($genap as $angka): Melakukan iterasi melalui Generator dan mencetak setiap angka genap.

Contoh Penggunaan Generator untuk Membaca File Besar

Generator sangat berguna untuk membaca file yang sangat besar baris demi baris tanpa memuat seluruh file ke dalam memori:

<?php

function bacaBarisFile(string $namaFile):
Generator
{
 $handle = fopen($namaFile, 'r');
 if ($handle) {
 while (($line = fgets($handle)) !== false) {
 yield $line;
 }
 fclose($handle);
 }
}

// Menggunakan Generator untuk membaca file
$file = bacaBarisFile('data.txt');

foreach ($file as $baris) {
 echo $baris;
}

Penjelasan Kode:

  • function bacaBarisFile(string $namaFile): Generator: Mendefinisikan fungsi bacaBarisFile yang menerima nama file dan mengembalikan Generator.
  • $handle = fopen($namaFile, 'r'): Membuka file dalam mode baca.
  • while (($line = fgets($handle)) !== false): Membaca file baris demi baris.
  • yield $line: Mengembalikan setiap baris menggunakan yield.
  • fclose($handle): Menutup file setelah selesai dibaca.

Common Pittfalls

  • Lupa menggunakan yield: Jika Anda tidak menggunakan yield di dalam fungsi, fungsi tersebut tidak akan menjadi Generator.
  • Memuat seluruh data sebelum yield: Pastikan Anda menghasilkan nilai secara bertahap daripada memuat seluruh data ke memori sebelum menggunakan yield.
  • Kesalahan penanganan file: Pastikan untuk menangani kesalahan saat membuka dan membaca file.

Challenge

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

Sumber Referensi

Bagikan: