Mengenal Closure pada PHP

25 Sep 2020

Assalamu’alaikum, semoga hari Anda menyenangkan karena saya akan mengenalkan apa itu closure, terutama closure pada PHP. Closure atau bisa disebut juga anonymous function adalah fungsi yang tidak memiliki nama. closures sangat berguna sebagai nilai dari parameter callback, tetapi juga berguna pada penggunaan lain. untuk lebih jelasnya kita lihat contoh dibawah

$hello = function() {
    echo 'world';
};

$hello();

Untuk memanggil closure gunakan tanda kurung tutup setelah nama variabel. karena closure sebenarnya sama seperti fungsi pada umumnya, maka kita juga dapat memberikan parameter pada closure.

$hello = function($msg) {
    echo $msg . ' world';
};

$hello('hello');

Contoh lain penggunaan closures, array_walk berguna untuk menerapkan fungsi ke setiap elemen pada array. jika parameter $userdata diisi maka data akan dilewatkan ke fungsi pada parameter ketiga.

$fruits = ['a' => 'Apel', 'b' => 'Belimbing', 'c' => 'Cerry'];
array_walk($fruits, function($item, $key) {
    echo $key . '. ' . $item . "\n";
});

Nama parameter tidak harus sama dengan contoh diatas tetapi urutan data tetap sama yaitu nilai array, kunci dan userdata jika ada.

array_walk($fruits, function(&$item, $key, $prefix) {
    echo "$key. $prefix $item\n";
}, 'buah');

Jika parameter userdata disertakan maka parameter pertama perlu dilewatkan sebagai referensi bukan sebagai nilai. agar nilainya dapat dirubah oleh userdata.

lihatlah perbedaannya jika tidak menggunakan closure

function test_print(&$item, $key, $prefix) {
    echo "$key. $prefix $item\n";
}
array_walk($fruits, 'test_print', 'buah');

sama kan?

Perlu diingat bahwa variabel diluar closure tidak dapat diakses, untuk dapat mengakses variabel diluar closure gunakan keyword use dan agar variabel diluar closures dapat dirubah didalam closures lewatkan parameter sebagai referensi. gunakan tanda & sebelum parameter use. lihat contoh dibawah ini

$products = [ [2, 1000], [3, 2000], [2, 3000]];
$tax = 0.05;

$total = 0.00;
array_walk($products, function($product, $key) use($tax, &$total) {
    $qty   = $product[0];
    $price = $product[1];

    $total += ($qty * $price) * ($tax+1.0);
});

echo round($total, 2);

Terlihat bahwa variabel $tax dapat dibaca didalam closures, dan juga variabel $total dapat berubah nilainya.

sekian dari saya, semoga bermanfaat. jika ada punya pemikiran lain silahkan merespon :)