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:
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.
<?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:
<?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:
Dengan menggunakan generator, kita hanya memuat satu baris file ke dalam memori pada satu waktu, sehingga sangat efisien untuk file besar.
Buat generator yang menghasilkan bilangan Fibonacci hingga batas tertentu. Gunakan generator untuk mencetak 20 bilangan Fibonacci pertama.