Menu Navigasi

Tutorial Tutorial Pemrograman Part 71: PHP Generators: Lazy Evaluation for Memory Efficiency

AI Generated
28 Desember 2025
14 views
Tutorial Tutorial Pemrograman Part 71: PHP Generators: Lazy Evaluation for Memory Efficiency

Pendahuluan

Selamat datang di bagian ke-71 dari seri tutorial pemrograman PHP kami! Di bagian ini, kita akan mempelajari tentang PHP Generators. Generators memungkinkan kita untuk melakukan lazy evaluation, yang sangat berguna untuk memproses data dalam jumlah besar tanpa menghabiskan memori secara berlebihan. Bagian ini mengasumsikan Anda sudah memahami dasar-dasar PHP, termasuk fungsi dan iterasi. Sebagai kelanjutan dari part sebelumnya tentang PHP Streams, kita akan melihat bagaimana Generators dapat melengkapi Streams untuk pemrosesan data yang lebih efisien.

Konsep Dasar

Bayangkan Anda memiliki sebuah file berukuran 1GB yang berisi daftar nama. Jika Anda membaca seluruh file ke dalam array sekaligus, Anda akan kehabisan memori. Generators menyelesaikan masalah ini dengan menghasilkan nilai satu per satu, hanya ketika dibutuhkan. Ini seperti keran air: air (data) hanya keluar saat Anda membukanya (meminta nilai).

Apa itu Generator?

Generator adalah fungsi khusus di PHP yang menghasilkan nilai menggunakan kata kunci yield. Alih-alih return, yield menangguhkan eksekusi fungsi dan mengembalikan nilai. Saat generator dipanggil lagi, eksekusi dilanjutkan dari titik terakhir.

Hands-on Coding

Contoh Sederhana Generator



Penjelasan:

  • function numberGenerator(int $start, int $end): Generator: Mendefinisikan fungsi generator yang menerima dua argumen integer, start dan end, dan mengembalikan sebuah Generator.
  • for ($i = $start; $i <= $end; $i++): Melakukan iterasi dari nilai start hingga end.
  • yield $i: Menghasilkan nilai $i. Ini menangguhkan fungsi dan mengembalikan nilai saat ini. Saat iterasi berikutnya, eksekusi dilanjutkan dari sini.
  • $numbers = numberGenerator(1, 5): Membuat instance dari generator. Perhatikan bahwa kode di dalam generator *tidak* dieksekusi saat ini.
  • foreach ($numbers as $number): Melakukan iterasi melalui nilai yang dihasilkan oleh generator. Setiap iterasi memicu eksekusi generator sampai mencapai yield berikutnya.

Generator dengan Kunci (Keys)


 'John';
 yield 'age' => 30;
 yield 'city' => 'New York';
}

$person = keyValueGenerator();

foreach ($person as $key => $value) {
 echo "$key: $value\n";
}
// Output:
// name: John
// age: 30
// city: New York
?>

Penjelasan:

  • Generator ini menghasilkan pasangan key-value, mirip dengan array asosiatif.
  • yield 'name' => 'John': Menghasilkan pasangan kunci 'name' dengan nilai 'John'.

Generator untuk Membaca File Besar



Penjelasan:

  • fileLineGenerator(string $filename): Generator: Fungsi generator untuk membaca file baris per baris.
  • fopen($filename, 'r'): Membuka file dalam mode baca.
  • fgets($file): Membaca satu baris dari file.
  • yield trim($line): Menghasilkan baris yang telah dibersihkan (whitespace dihilangkan).
  • fclose($file): Menutup file setelah selesai.

Common Pitfalls

  • Lupa tipe deklarasi Generator: Pastikan untuk mendeklarasikan tipe kembalian fungsi sebagai Generator.
  • Mencoba mengakses generator yang sudah habis: Setelah generator selesai menghasilkan semua nilai, ia tidak dapat digunakan kembali. Anda harus membuat instance baru.
  • Menggunakan Generator untuk operasi yang membutuhkan semua data sekaligus: Generator paling efektif ketika Anda memproses data secara bertahap. Jika Anda membutuhkan semua data dalam satu waktu (misalnya, untuk mengurutkan array besar), menggunakan generator mungkin tidak efisien.

Challenge

Buatlah sebuah generator yang menghasilkan bilangan Fibonacci hingga batas tertentu. Gunakan generator ini untuk mencetak 20 bilangan Fibonacci pertama.

Sumber Referensi

Bagikan: