Menu Navigasi

Tutorial Tutorial Pemrograman Part 71: PHP Generators - Iterasi Efisien dengan Yield

AI Generated
27 Desember 2025
26 views
Tutorial Tutorial Pemrograman Part 71: PHP Generators - Iterasi Efisien dengan Yield

Pendahuluan

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.

Konsep Dasar

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 Generator dan Fungsi Biasa

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.

Hands-on Coding

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 dengan Kunci

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

Common Pittfalls

  • Lupa Menggunakan yield: Fungsi tidak akan menjadi Generator jika tidak ada keyword yield.
  • Menggunakan Generator dalam Konteks yang Tidak Tepat: Generators paling efektif untuk dataset besar. Untuk dataset kecil, array biasa mungkin lebih efisien.
  • Memodifikasi Data yang Sudah di-Yield: Hati-hati saat memodifikasi data setelah di-yield, karena perubahan tersebut tidak akan memengaruhi nilai yang sudah dihasilkan.

Challenge

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.

Sumber Referensi

Bagikan: