Memahami Konsep Closure di PHP/JavascriptClosure! Hmm, topik ini merupakan salah satu topik yang membingungkan buat saya waktu itu (selain Prototyping). Bahkan di beberapa screencast atau video tutorial yang saya lihat, Closure merupakan the weirdest issue atau very missunderstood issue karena konsep dari Javascript yang menggunakan pendekatan event driven environment.
Coba lihat kedua kode program di atas. Di sebelah kiri saya menggunakan PHP dan sebelah kanan menggunakan Javascript. Kedua program di atas terlihat akan menghasilkan output yang sama, "Hello World!". Benar? Mari kita eksekusi kode Javascript terlebih dahulu.
Oke, seperti yang kita duga kode program akan menghasilkan output "Hello World!". Lalu selanjutnya kita eksekusi kode PHP.
Kode program yang kita buat menghasilkan pesan error, "Undefined variable: a". Tunggu, perasaan saya telah mendefinisikan variabel $a = "Hello" di line 5. Apa yang salah? Di dunia pemrograman kita mengenal istilah scope atau cakupan/ruang lingkup. Variabel $a hanya berada pada ruang lingkup dari fungsi hello() sehingga variabel $a tidak bisa diakses di luar fungsi tersebut. Lalu bagimana dengan variabel $b? Variabel tersebut satu ruang lingkup dengan variabel $a. Tapi kenapa variabel $a tidak bisa diakses oleh variabel $b? Jawabannya karena kita membuatnya menggunakan bahasa pemrograman PHP = Pemberi Harapan Palsu. Hahaha. Bukan, bukan itu masalahnya. Masalahnya adalah variabel $b berisi Closure. Closure tak lebih dan tak kurang hanyalah sebuah anonymous function. Dan setiap function mempunyai scope-nya sendiri-sendiri. Ingat! Biar saya ilustrasikan begini. Kita buat saja ilustrasi ini layaknya sebuah percakapan antara saya dengan si PHP. Mari kita mulai! S: Saya, P: PHP
S: Cuy, tolong definisikan fungsi hello dong di line 3. Kira-kira begitulah percakapan yang terjadi antara saya dengan si bodoh PHP. Lalu bagaimana dengan si Javascript? Kira-kira begini percakapan yang berhasil saya rekam. S: Saya, J: Javascript
P: Cuy, tolong di line 3 buat fungsi namanya hello dong. Kalo kita perhatikan dua percakapan di atas. Permasalahan yang muncul itu bukan pada si PHP atau si Javascript-nya. Masalah terbesarnya ada pada saya. Saya kurang memberikan instruksi yang lengkap untuk si PHP. Mungkin karena si PHP tidak se-intuitif si Javascript, PHP hanya mengerjakan apa yang benar-benar saya suruh saja. Under the hood, Javascript secara otomatis mereferensikan variabel $a pada closure $b dengan cara men-inherits scope parentnya. Jadi ketika saya membuat closure $b, secara otomatis scope dari closure $b adalah scope dari fungsi parentnya yaitu fungsi hello(). Namun beda cerita di PHP dimana kamu harus mereferensikan parameternya secara manual. In JavaScript, a closure can be thought of as a scope, when you define a function, it silently inherits the scope it's defined in, which is called its closure, and it retains that no matter where it's used. It's possible for multiple functions to share the same closure, and they can have access to multiple closures as long as they are within their accessible scope. In PHP, a closure is a callable class, to which you've bound your parameters manually. Lalu bagaimana cara menyuruh si PHP untuk mereferensikan variabel $a yang berapa di parent scope-nya? Kita binding secara manual menggunakan keyword use.
Sekarang ayo kita cek apakah si PHP menjalankan perintah seperti yang sudah saya instruksikan.
Hello World! :) |