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.
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.
Mari kita lihat contoh sederhana untuk memahami bagaimana generators bekerja.
<?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.for, kita menggunakan kata kunci yield untuk menghasilkan setiap angka dari $start hingga $end.numberGenerator dipanggil, ia mengembalikan sebuah objek generator, yang kemudian kita iterasi menggunakan foreach.foreach meminta nilai berikutnya dari generator, fungsi numberGenerator dilanjutkan dari titik terakhirnya (yield).<?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').while membaca setiap baris dari file menggunakan fgets dan kemudian menggunakan yield untuk menghasilkan baris tersebut.fclose setelah selesai dibaca.<?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:
yield: Jika Anda lupa menggunakan yield, fungsi Anda tidak akan menjadi generator.try...finally untuk memastikan resource selalu dibebaskan, bahkan jika terjadi pengecualian.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.