Arrow function adalah fungsi anonim yang pendek: fn($x) => $x * 2. Body setelah => berupa satu ekspresi yang nilainya dikembalikan, dan variabel apa pun dari kode di sekitarnya yang dipakai ekspresi itu otomatis ditangkap sebagai nilai. Arrow function ada sejak PHP 7.4 dan kebanyakan dipakai sebagai callback.
Sintaksnya
fn, daftar parameter, =>, lalu satu ekspresi. Tipe parameter, nilai bawaan, dan tipe kembalian bekerja sama seperti di fungsi biasa:
Tidak ada kata kunci return dan tidak ada kurung kurawal. Ekspresi yang panjang tetap bisa dipecah ke beberapa baris supaya mudah dibaca.
Variabel luar ditangkap sebagai nilai
Arrow function melihat setiap variabel di scope tempat ia dibuat. Nilai-nilainya disalin pada saat itu. Perubahan di dalam tetap di dalam, dan perubahan di luar setelah fungsi dibuat tidak terlihat:
Inilah perbedaan utamanya dengan function () use (&$count), yang bisa berbagi variabel lewat referensi. Arrow function tidak bisa mengisi ulang variabel dari luar. Ia tetap bisa mengubah objek yang ditangkapnya (salinannya adalah penunjuk ke objek yang sama), dan parameter yang dideklarasikan sebagai referensi bekerja seperti di fungsi mana pun: fn(array &$list) => $list[] = 'x'.
Callback untuk array_map, array_filter, dan usort
Sebagian besar fungsi array menerima callback, dan di situlah arrow function paling banyak memangkas kode yang berisik. Bandingkan satu filter yang ditulis dengan dua cara:
<=> mengembalikan -1, 0, atau 1, persis yang dibutuhkan usort(), jadi mengurutkan berdasarkan sebuah field cukup satu baris. Tukar $a dan $b untuk mengurutkan secara menurun.
Arrow function yang mengembalikan arrow function
Variabel yang ditangkap termasuk parameter dari arrow function yang membungkusnya, jadi kamu bisa menyarangkannya untuk membuat fungsi dari nilai lain:
Perhatikan bahwa array_filter() mempertahankan key aslinya, karena itulah hasilnya dimulai dari indeks 1.
fn vs function: kapan kamu butuh closure lengkap
Arrow function tidak lagi cukup saat body-nya butuh lebih dari satu ekspresi atau harus mengubah variabel dari luar. Saat itu, pakai fungsi anonim:
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| Body | satu ekspresi | pernyataan apa pun |
| Return | otomatis | return eksplisit |
| Variabel luar | semua yang dipakai, otomatis | hanya yang ditulis di use |
| Tangkap lewat referensi | tidak | ya, use (&$y) |
| Tersedia sejak | PHP 7.4 | PHP 5.3 |
Saat sebuah arrow function terasa sesak, sering kali itu tanda tugasnya sebenarnya dua tugas. Memecahnya menjadi filter dan penjumlahan, seperti di atas, membuat setiap callback tetap satu ekspresi.
Pertanyaan yang sering diajukan
Apa itu arrow function di PHP?
Fungsi anonim pendek yang diperkenalkan di PHP 7.4: fn($x) => $x * 2. Body-nya berupa satu ekspresi yang nilainya otomatis dikembalikan, dan fungsi ini bisa membaca variabel dari scope di sekitarnya tanpa klausa use.
Apakah arrow function PHP bisa berisi beberapa baris?
Tidak. Body setelah => harus berupa satu ekspresi; tidak ada blok berisi pernyataan. Kamu boleh memecah ekspresi yang panjang ke beberapa baris, tetapi kalau butuh if, loop, atau beberapa pernyataan, pakai function () use (...) { ... } sebagai gantinya.
Apakah arrow function bisa mengubah variabel dari luar?
Tidak. Arrow function menangkap variabel luar sebagai nilai, jadi fn() => $count++ hanya mengubah salinannya sendiri dan $count di luar tetap sama. Untuk mengubah variabel dari luar, pakai closure dengan use (&$count).
Apa bedanya fn dan function di PHP?
fn($x) => ... berisi satu ekspresi, mengembalikannya secara implisit, dan menangkap setiap variabel luar yang dipakainya sebagai nilai. function ($x) use ($y) { ... } bisa berisi pernyataan apa pun, butuh return yang eksplisit, dan hanya melihat variabel yang ditulis di use, yang bisa ditangkap lewat referensi.