Mempelajari Fitur Generator dan Implementasinya dalam PHP

Ahmad Oriza 19 Februari 2019

Mempelajari Fitur Generator dan Implementasinya dalam PHP

Kali ini kita akan belajar tentang php generator. Apa sih generator? Dari namanya saja sudah terwakili, generate (pembangkit), lalu apa yang dibangkitkan? yang dibangkitkan disini adalah komponen penyimpanan sementara yang siap untuk di iterasi kan / loop. Konsep ini bukan hanya milik dunia PHP, namun ada juga dalam beberapa bahasa pemrograman lain.

Dalam dunia nyata seringkali kita menggunakan tipe data array dalam kode. Dan biasanya array tersebut kita gunakan dalam iterasi untuk mengoperasikannya baik memanipulasi maupun sekedar menampilkannya.

Nah disini generator menawarkan cara lain dalam iterasi. Alih-alih kita menggunakan array, kita dapat menggunakan konsep generator. Alhasil kita dapat menghemat alokasi memory.

Istilah Generator juga dipakai dalam dunia framework, generator biasanya berupa suatu command line tools yang berguna buat generate boilerplate / kumpulan kode (scaffolding), seperti Laravel Artisan, Fuel Oil, atau Rails Command.

Supaya lebih terbayang mari kita coba terapkan dalam kode sederhana berikut ini :

<?php
// Get number
function get_numbers() {
    for ($i = 1; $i <= 500; $i++) {
        yield $i;
    }
}

$result = get_numbers();

foreach ($result as $value) {
    echo "$value";
}

function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

echo "\n\nMemory terpakai : " . convert(memory_get_usage());

Mari kita telaah kodenya, coba perhatikan baris ke 3, kita membuat fungsi bernama get_numbers untuk membangkitkan angka 1-500. Lihat baris ke 5, hasil dari looping kita simpan dengan keyword yield. Kemudian pada baris ke 9 kita memanggil fungsi tersebut dan meng-assign nya ke variabel result. Setelah itu pada baris ke 11 kita menampilkan kembali hasil fungsi dalam iterasi. Terakhir, pada baris 15-21 kita menampilkan alokasi memory yang terpakai pada program kecil kita.

Cobalah program diatas, teman-teman bebas menggunakan nama file apapun. Kode tersebut akan menghasilkan output sebagai berikut :

Image

Program tersebut menghasilkan angka 1-500 dan terakhir menghitung alokasi memory kemudian menampilkannya. Bisa kita lihat program tersebut memakai 125.66 kb

Yang dapat kita petik dari kode diatas, penggunaan generator di PHP membutuhkan keyword yield sebagai penolong. Kemudian generator harus dibungkus dalam suatu fungsi. Pada fungsi generator kita tidak butuh lagi keyword return.

Mengapa Harus Coba Generator/Generator Function

Teman-teman pasti bertanya-tanya, kalau bisa pakai array kenapa harus menggunakan generator untuk menampung hasil (untuk kepentingan iterasi).

Baca juga: Kumpulan Tutorial PHP

Yang saya pelajari, manfaat penggunaan generator adalah penghematan alokasi memory dan kesederhanaan dalam sintaks. Mari kita buat program dengan output / tujuan yang sama seperti program sebelumnya, namun disini kita akan menggunakan array untuk menampung hasil.

Mari perhatikan kode berikut ini :

<?php
// Get number
function get_numbers() {
	$temp = [];
    
    for ($i = 1; $i <= 500; $i++) {
        $temp[] = $i;
    }
    
    return $temp;
}

$result = get_numbers();

foreach ($result as $value) {
    echo "$value";
}

function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

echo "\n\nMemory terpakai : " . convert(memory_get_usage());

Yang berubah dibandingkan kode sebelumnya, hanya pada logika dalam fungsi get_numbers. Bisa dilihat kita menggunakan variabel $temp berjenis array sebagai penampung hasil. Lalu mengembalikan nilai operasi dengan keyword return.

Jika kita eksekusi kode tersebut akan menghasilkan output :

Image

Hasil yang sama dengan program sebelumnya, namun penggunaan memory lebih besar, yaitu 166.94 kb

Yah, memang tidak terlalu significant penggunaan memory-nya. Mungkin akan terasa jika program lebih kompleks lagi. Lihat juga sintaks yang digunakan, program versi generator terlihat lebih simple.

Demikian penjelasan singkat saya mengenai generator, semoga bermanfaat!