Fungsi
Membuat fungsi, parameter bertipe, nilai default, named arguments, variadic, arrow function, closure, dan cakupan variabel.
Mengapa fungsi?
Fungsi membungkus sepotong logika dengan nama sehingga bisa dipakai ulang, diuji, dan dibaca dengan mudah. Prinsip DRY (Don't Repeat Yourself): jika kamu menyalin kode yang sama tiga kali, jadikan fungsi.
function sapa(string $nama): string
{
return "Halo, {$nama}!";
}
echo sapa('Sari'); // Halo, Sari!
Bagian-bagiannya: kata kunci function, nama, parameter dengan tipe, tipe kembalian setelah :, dan return untuk mengembalikan nilai.
Nilai default & named arguments (PHP 8.0)
function hitungHarga(int $harga, float $diskon = 0.0, float $ppn = 0.11): float
{
return $harga * (1 - $diskon) * (1 + $ppn);
}
hitungHarga(100000); // pakai default
hitungHarga(100000, 0.1); // posisi
hitungHarga(harga: 100000, ppn: 0.0); // named: urutan bebas, lewati yang default
Named arguments membuat pemanggilan mudah dibaca ("ppn: 0.0" jelas artinya) dan memungkinkan melewati parameter opsional di tengah. Setelah memakai argumen bernama, sisanya harus bernama juga.
Tipe nullable, union, dan void
function cariUser(int $id): ?array {} // array atau null
function ubah(int|string $id): int|false {} // union type (8.0)
function catat(string $pesan): void {} // tidak mengembalikan apa pun
Variadic & spread
function jumlah(int ...$angka): int
{
return array_sum($angka);
}
echo jumlah(1, 2, 3); // 6
echo jumlah(...[4, 5, 6]); // spread array menjadi argumen
Arrow function & closure
$ganda = fn (int $x): int => $x * 2; // arrow: satu ekspresi, auto-capture
$pajak = 0.11;
$denganPajak = function (int $harga) use ($pajak): float {
return $harga * (1 + $pajak); // closure: variabel luar via use
};
Arrow function menangkap variabel luar berdasarkan nilai secara otomatis, tetapi hanya boleh berisi satu ekspresi. Untuk logika lebih panjang, gunakan closure biasa dengan use.
Cakupan variabel (scope)
Variabel di dalam fungsi bersifat lokal — tidak terlihat dari luar, dan variabel luar tidak terlihat dari dalam. Hindari global; kirim data lewat parameter dan kembalikan lewat return. Variabel static mempertahankan nilainya antar pemanggilan:
function hitungPanggilan(): int
{
static $n = 0;
return ++$n;
}
First-class callable (PHP 8.1)
$panjang = strlen(...); // referensi ke fungsi
$hasil = array_map(strtoupper(...), ['a', 'b']); // ['A', 'B']
Fungsi sebagai nilai
Fungsi bisa disimpan di variabel, dikirim sebagai argumen, dan dikembalikan dari fungsi lain — fondasi array_map, usort, middleware, dan event listener di framework.
Praktik baik
- Satu fungsi, satu tugas; nama berupa kata kerja (
hitungTotal,kirimEmail). - Selalu beri tipe parameter & kembalian.
- Hindari efek samping tersembunyi; lebih baik kembalikan nilai daripada mengubah variabel global.