Selamat datang di part 58 dari seri tutorial pemrograman PHP kita! Di part sebelumnya, kita telah membahas tentang Advanced Error Handling dengan Custom Exceptions. Kali ini, kita akan menyelami topik yang sangat penting untuk optimasi performa, terutama saat bekerja dengan data yang besar: PHP Generators. Generators memungkinkan kita untuk melakukan iterasi data tanpa memuat seluruh data ke dalam memori sekaligus. Ini sangat berguna ketika kita berurusan dengan file berukuran besar, koneksi database yang mengembalikan banyak data, atau skenario lain di mana penggunaan memori menjadi perhatian utama.
Prasyarat: Sebelum memulai, pastikan Anda sudah familiar dengan konsep dasar loop (for, foreach) dan array di PHP.
Bayangkan Anda memiliki pabrik yang memproduksi mobil. Cara tradisional adalah memproduksi semua mobil sekaligus, menyimpannya di gudang, dan kemudian mendistribusikannya. Cara ini memakan banyak ruang (memori). Generators seperti memiliki 'pabrik on-demand'. Pabrik ini hanya memproduksi mobil ketika ada permintaan. Setiap kali ada permintaan, pabrik membuat satu mobil dan mengirimkannya. Tidak ada gudang besar yang dibutuhkan.
Dalam konteks PHP, generator adalah sebuah fungsi yang berperilaku seperti iterator. Alih-alih mengembalikan sebuah array, generator menggunakan keyword yield untuk menghasilkan nilai satu per satu. Setiap kali nilai di-yield, eksekusi fungsi dihentikan sementara, dan nilai tersebut dikembalikan ke kode yang memanggil generator. Eksekusi fungsi akan dilanjutkan pada panggilan berikutnya, dimulai dari titik terakhir di mana yield dipanggil.
Contoh ini menunjukkan bagaimana membuat generator yang menghasilkan urutan angka:
<?php
function numberGenerator(int $start, int $end):
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}
$generator = numberGenerator(1, 5);
foreach ($generator as $number) {
echo "Number: " . $number . "<br>";
}
?>
Penjelasan:
function numberGenerator(int $start, int $end): Mendefinisikan fungsi generator yang menerima dua parameter, $start dan $end, yang menentukan rentang angka yang akan dihasilkan.for ($i = $start; $i <= $end; $i++): Melakukan iterasi dari $start hingga $end.yield $i;: Menghasilkan nilai $i. Ini adalah kunci dari generator. Eksekusi fungsi berhenti di sini, dan $i dikembalikan. Pada iterasi berikutnya, eksekusi dilanjutkan dari baris ini.$generator = numberGenerator(1, 5);: Membuat instance dari generator.foreach ($generator as $number): Melakukan iterasi melalui nilai-nilai yang dihasilkan oleh generator.Contoh ini menunjukkan bagaimana menggunakan generator untuk membaca file besar baris per baris tanpa memuat seluruh file ke dalam memori:
<?php
function readFileLineByLine(string $filePath):
$file = fopen($filePath, 'r');
if (!$file) {
throw new Exception('Could not open file: ' . $filePath);
}
while (($line = fgets($file)) !== false) {
yield $line;
}
fclose($file);
}
$filePath = 'large_file.txt'; // Ganti dengan path file Anda
foreach (readFileLineByLine($filePath) as $line) {
echo $line;
}
?>
Penjelasan:
function readFileLineByLine(string $filePath): Mendefinisikan fungsi generator yang menerima path file sebagai parameter.$file = fopen($filePath, 'r');: Membuka file untuk dibaca.while (($line = fgets($file)) !== false): Membaca file baris per baris menggunakan fgets().yield $line;: Menghasilkan setiap baris yang dibaca.fclose($file);: Menutup file setelah selesai dibaca.Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga angka tertentu. Bilangan Fibonacci adalah urutan angka di mana setiap angka adalah jumlah dari dua angka sebelumnya (misalnya, 0, 1, 1, 2, 3, 5, 8, ...). Gunakan generator untuk mencetak bilangan Fibonacci hingga 100.