Selamat datang kembali di seri tutorial Tutorial Pemrograman! Di part sebelumnya, kita telah mempelajari tentang SplFileObject untuk manipulasi file tingkat lanjut. Sekarang, di part 65 ini, kita akan menjelajahi konsep yang sangat berguna untuk optimasi memori dalam PHP: Generators. Generators memungkinkan kita menghasilkan nilai secara bertahap (lazy evaluation), sehingga kita tidak perlu memuat seluruh data ke dalam memori sekaligus. Ini sangat berguna ketika kita berurusan dengan dataset yang besar atau operasi yang kompleks.
Prasyarat:
Bayangkan Anda memiliki pabrik yang menghasilkan sejumlah besar mainan. Alih-alih membuat seluruh mainan dan menyimpannya di gudang, pabrik tersebut hanya membuat mainan sesuai permintaan. Inilah ide dasar dari generators dalam PHP. Generator adalah fungsi yang menghasilkan nilai satu per satu menggunakan kata kunci yield. Setiap kali yield dipanggil, fungsi akan 'berhenti sejenak' dan mengembalikan nilai tersebut. Ketika nilai berikutnya dibutuhkan, fungsi akan melanjutkan dari titik terakhir yield. Ini memungkinkan kita memproses data besar tanpa membebani memori.
Lazy Evaluation: Proses evaluasi ekspresi ditunda sampai nilainya benar-benar dibutuhkan. Generator memanfaatkan prinsip ini.
<?php
function angkaGenerator(int $max):
Generator
{
for ($i = 1; $i <= $max; $i++) {
yield $i;
}
}
$angka = angkaGenerator(5);
foreach ($angka as $nomer) {
echo "Angka: " . $nomer . "<br>";
}
?>
Penjelasan:
angkaGenerator menerima sebuah integer $max sebagai parameter.for berjalan dari 1 hingga $max.yield mengembalikan nilai $i setiap iterasi.Generatorforeach digunakan untuk mengiterasi nilai yang dihasilkan oleh generator.
<?php
function bacaBarisFile(string $namaFile):
Generator
{
$file = fopen($namaFile, 'r');
if ($file) {
while (($baris = fgets($file)) !== false) {
yield $baris;
}
fclose($file);
}
}
// Gantilah 'data_besar.txt' dengan nama file Anda
$data = bacaBarisFile('data_besar.txt');
foreach ($data as $baris) {
echo $baris;
}
?>
Penjelasan:
bacaBarisFile menerima nama file sebagai parameter.while membaca setiap baris dari file menggunakan fgets.yield mengembalikan setiap baris.foreach digunakan untuk mengiterasi baris yang dihasilkan oleh generator.
<?php
function generatorDenganKunci(array $data):
Generator
{
foreach ($data as $kunci => $nilai) {
yield $kunci => $nilai;
}
}
$data = [
'nama' => 'Budi',
'usia' => 30,
'pekerjaan' => 'Pengembang Web'
];
$generator = generatorDenganKunci($data);
foreach ($generator as $kunci => $nilai) {
echo "$kunci: $nilai<br>";
}
?>
Penjelasan:
generatorDenganKunci menerima array sebagai parameter.foreach mengiterasi setiap elemen array.yield mengembalikan kunci dan nilai.foreach digunakan untuk mengiterasi kunci dan nilai yang dihasilkan oleh generator.yield: Tanpa yield, fungsi tidak akan menjadi generator.yield.yield sesuai dengan yang diharapkan oleh kode yang mengkonsumsi generator.Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu. Bilangan Fibonacci adalah deretan angka di mana angka berikutnya adalah jumlah dari dua angka sebelumnya (misalnya: 0, 1, 1, 2, 3, 5, 8...).