Selamat datang di bagian ke-60 dari seri tutorial Tutorial Pemrograman! Di bagian ini, kita akan membahas tentang PHP Generators. Generators memungkinkan kita untuk memproses data berukuran besar secara efisien dengan menghindari pemuatan seluruh dataset ke dalam memori sekaligus. Pemahaman tentang iterasi dan array di PHP akan sangat membantu.
yield akan membantu.Bayangkan Anda memiliki file log berukuran sangat besar. Jika Anda mencoba memuat seluruh isi file tersebut ke dalam array, memori server Anda mungkin akan kewalahan. Disinilah Generators masuk. Generator adalah fungsi yang menghasilkan nilai satu per satu saat diminta, daripada menghasilkan seluruh kumpulan nilai sekaligus. Setiap kali yield dipanggil, fungsi akan 'pause' dan mengembalikan nilai. Ketika diminta untuk nilai berikutnya, fungsi akan melanjutkan dari titik terakhir ia berhenti.
Analoginya seperti ini: Bayangkan Anda memiliki mesin pembuat es krim. Daripada membuat seluruh batch es krim sekaligus, mesin ini membuat satu scoop es krim setiap kali Anda memintanya. Ini lebih efisien daripada membuat seluruh batch sekaligus, terutama jika Anda hanya membutuhkan beberapa scoop.
<?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 menggunakan keyword yield untuk menghasilkan nilai.yield $i dipanggil, fungsi akan 'pause' dan mengembalikan nilai $i.foreach kemudian mengiterasi nilai-nilai yang dihasilkan oleh generator.<?php
function readFileLineByLine(string $filename):
Generator
{
$file = fopen($filename, 'r');
if (!$file) {
throw new Exception('Tidak dapat membuka file: ' . $filename);
}
while (($line = fgets($file)) !== false) {
yield $line;
}
fclose($file);
}
$filename = 'large_file.txt';
try {
foreach (readFileLineByLine($filename) as $line) {
echo $line;
}
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Penjelasan:
readFileLineByLine membuka file dan membaca setiap baris menggunakan fgets.yield $line mengembalikan setiap baris file satu per satu.try...catch digunakan untuk menangani pengecualian jika file tidak dapat dibuka, sejalan dengan Part sebelumnya mengenai Error Handling.Buat generator yang menghasilkan bilangan Fibonacci hingga jumlah tertentu. Contoh: jika jumlahnya adalah 10, generator harus menghasilkan 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.