Anonymous Function Di PHP


PHP sejak versi 5.3 sudah mendukung anonymous function dan closure.  Sementara itu, Java hingga versi 7 masih belum mendukung closure secara penuh (selain dengan variabel final).  Fitur ini akan disertakan pada Java 8 nanti dengan memakai lambda expression.

Apa itu closure?  Artikel Memakai Closure Di JavaScript menjelaskan tentang closure dan contoh penerapannya di JavaScript.  Pada tulisan ini, saya akan mencoba menggunakan fitur closure di PHP.

Sebagai contoh, saya ingin menghasilkan menu dari array berikut ini:

<?php
  $daftarMenu = array("FILE", "EDIT", "SOURCE", "REFACTOR");
?>

Saya mendefinisikan sebuah anonymous function yang akan menghasilkan HTML berdasarkan string di setiap elemen array, lalu menyimpan anonymous function tersebut ke sebuah variabel, seperti pada kode program berikut ini:

<?php
  $daftarMenu = array("FILE", "EDIT", "SOURCE", "REFACTOR");

  $prosesMenu = function($namaMenu, $indexMenu) {
     print "<div style='background-color: #00ccff; margin: 5px; padding: 5px; float: left;'>$namaMenu</div>";
  }
?>

Sekarang, saya dapat memproses setiap elemen array di $daftarMenu dengan anonymous function $prosesMenu dengan menggunakan array_walk seperti pada kode program berikut ini:

<?php
  $daftarMenu = array("FILE", "EDIT", "SOURCE", "REFACTOR");  
  $prosesMenu = function($namaMenu, $indexMenu) {
     print "<div style='background-color: #00ccff; margin: 5px; padding: 5px; float: left;'>$namaMenu</div>";
  }

  array_walk($daftarMenu, $prosesMenu);
?>

Pada contoh di atas, saya baru menggunakan anonymous function dan belum memakai closure.  Sekarang, seandainya saya ingin memberikan pewarnaan yang berbeda untuk menu yang sedang aktif, maka saya perlu melakukan perubahan kode program sehingga terlihat seperti berikut ini:

<?php
  $daftarMenu = array("FILE", "EDIT", "SOURCE", "REFACTOR");  
  $prosesMenu = function($namaMenu, $indexMenu, $menuAktif) {
     if ($menuAktif==$indexMenu) {
        $backgroundColor = "#cc00ff";
     } else {
        $backgroundColor = "#00ccff";
     }
     print "<div style='background-color: $backgroundColor; margin: 5px; padding: 5px; float: left;'>$namaMenu</div>";
  }

  array_walk($daftarMenu, $prosesMenu);
?>

Bila program PHP tersebut dijalankan, menu pertama (index 0) akan selalu di-highlight karena nilai $menuAktif selalu adalah 0.  Seandainya saya bisa mendefinisikan $menuAktif  secara langsung, apakah saya bisa memberikan kode program berikut ini:

<?php
  $daftarMenu = array("FILE", "EDIT", "SOURCE", "REFACTOR");

  $menuAktif = 1;

  $prosesMenu = function($namaMenu, $indexMenu, $menuAktif) {
     if ($menuAktif==$indexMenu) {
        $backgroundColor = "#cc00ff";
     } else {
        $backgroundColor = "#00ccff";
     }
     print "<div style='background-color: $backgroundColor; margin: 5px; padding: 5px; float: left;'>$namaMenu</div>";
  }

  array_walk($daftarMenu, $prosesMenu);
?>

Ternyata variabel $menuAktif belum dapat diakses secara langsung oleh anonymous function!  Menu dengan index 1 (urutan kedua) tidak akan di-highlight.  PHP mensyaratkan penggunaan keyword use bila ingin memakai variabel di parent scope di closure.  Dengan demikian, saya harus mengubah kode program di atas menjadi:

<?php
  $daftarMenu = array("FILE", "EDIT", "SOURCE", "REFACTOR");

  $menuAktif = 1;

  $prosesMenu = function($namaMenu, $indexMenu, $menuAktif) use ($menuAktif) {
     if ($menuAktif==$indexMenu) {
        $backgroundColor = "#cc00ff";
     } else {
        $backgroundColor = "#00ccff";
     }
     print "<div style='background-color: $backgroundColor; margin: 5px; padding: 5px; float: left;'>$namaMenu</div>";
  }

  array_walk($daftarMenu, $prosesMenu);
?>

Sekarang nilai $menuAktif di dalam anonymous function adalah 1.  Dengan closure, saya dapat memakai variabel $menuAktif di dalaman sebuah anonymous function walaupun variabel $menuAktif bukanlah variabel global.

Perihal Solid Snake
I'm nothing...

One Response to Anonymous Function Di PHP

  1. Aldi Unanto mengatakan:

    Andai tidak perlu menggunakan keyword ‘use’ untuk bisa memakai variable di luar fungsi, pasti lebih simple ya mas😀

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: