Selamat datang di part 71 seri tutorial Tutorial Pemrograman! Di part ini, kita akan menyelami konsep PHP Generators. Generators memungkinkan kita untuk mengiterasi data secara efisien, terutama ketika berhadapan dengan dataset yang besar. Prasyarat untuk memahami tutorial ini adalah pemahaman dasar tentang iterator dan fungsi dalam PHP. Kita akan menghubungkan konsep ini dengan apa yang telah kita pelajari di part sebelumnya tentang PHP Reflection, di mana kita bisa mengintrospeksi kode secara dinamis. Generators, seperti halnya reflection, adalah fitur canggih yang membantu kita menulis kode yang lebih efisien dan fleksibel.
Bayangkan Anda memiliki sebuah file log yang sangat besar. Memuat seluruh isi file ke dalam memori untuk kemudian diiterasi akan sangat boros memori. Di sinilah Generators berperan. Generators adalah fungsi khusus yang mengembalikan iterator. Alih-alih mengembalikan sebuah array yang berisi semua data, Generator mengembalikan sebuah objek yang dapat diiterasi, dan setiap nilai dihasilkan (yield) hanya ketika dibutuhkan. Analogi dunia nyatanya adalah seperti keran air. Air (data) hanya keluar ketika keran dibuka (diminta oleh iterator).
Perbedaan utama antara fungsi biasa dan Generator terletak pada keyword yield. Fungsi biasa menggunakan return untuk mengembalikan sebuah nilai, sedangkan Generator menggunakan yield untuk menghasilkan sebuah nilai pada setiap iterasi. Fungsi biasa berhenti setelah return dipanggil, sedangkan Generator dapat dilanjutkan dari titik terakhir di mana yield dipanggil.
Mari kita buat sebuah Generator sederhana yang menghasilkan bilangan Fibonacci:
<?php
function fibonacciGenerator(int $limit):
Generator
{
$a = 0;
$b = 1;
$count = 0;
while ($count < $limit) {
yield $a;
$temp = $b;
$b = $a + $b;
$a = $temp;
$count++;
}
}
// Penggunaan Generator
foreach (fibonacciGenerator(10) as $number) {
echo $number . " ";
}
// Output: 0 1 1 2 3 5 8 13 21 34
Penjelasan Kode:
fibonacciGenerator(int $limit): Generator: Mendefinisikan fungsi Generator yang menerima sebuah integer sebagai limit dan mengembalikan objek Generator.yield $a: Menghasilkan nilai $a pada setiap iterasi. Eksekusi fungsi dihentikan sementara dan dilanjutkan saat iterasi berikutnya.foreach (fibonacciGenerator(10) as $number): Mengiterasi objek Generator dan mencetak setiap bilangan Fibonacci yang dihasilkan.Generator juga bisa menghasilkan nilai dengan kunci (key), seperti array asosiatif:
<?php
function userGenerator(array $users):
Generator
{
foreach ($users as $id => $user) {
yield $id => $user;
}
}
$users = [
1 => 'John Doe',
2 => 'Jane Smith',
3 => 'Peter Jones',
];
foreach (userGenerator($users) as $id => $user) {
echo "User ID: " . $id . ", Name: " . $user . "<br>";
}
// Output:
// User ID: 1, Name: John Doe
// User ID: 2, Name: Jane Smith
// User ID: 3, Name: Peter Jones
yield: Fungsi tidak akan menjadi Generator jika tidak ada keyword yield.Buatlah sebuah Generator yang membaca sebuah file teks baris per baris, dan menghasilkan setiap baris sebagai nilai. Gunakan fopen, fgets, dan fclose untuk membaca file.