Fungsi membungkus logika menjadi unit yang bisa dipanggil berulang, dan gaya penulisan fungsinya adalah bagian paling khas dari kode Laravel modern: parameter bertipe, default value, return type eksplisit, dan arrow function ringkas. Ketika kita membaca routing Laravel
, closure route yang kita tulis adalah fungsi; ketika membaca helper seperti config(), kita sedang memanggil fungsi. Chapter ini membedah gaya penulisan fungsi yang dipakai framework, lengkap dengan pola parameter yang paling sering muncul.
Anatomi Fungsi Modern #
Fungsi modern PHP mendeklarasikan tipe pada parameter dan return value. Berikut bentuk yang akan sering kita temui:
<?php
function hitungDiskon(float $harga, float $persen): float
{
return $harga * $persen / 100;
}
echo "Potongan: ", hitungDiskon(150000, 20), "\n";Output yang Dihasilkan:
Potongan: 30000Signature di atas memberi tiga informasi: parameter $harga dan $persen wajib berupa float, dan fungsi hitungDiskon wajib mengembalikan float. Angka 150000 dan 20 yang kita kirim berupa int, tetapi PHP mengonversi keduanya ke float secara otomatis karena konversi int ke float selalu aman.
Nilai Default dan Parameter Nullable #
Parameter boleh memiliki nilai cadangan yang dipakai ketika pemanggil tidak mengirim argumen. Tanda ? di depan tipe (misalnya ?string) berarti parameter juga menerima null:
<?php
function sapaPengguna(?string $nama): string
{
return "Halo, " . ($nama ?? "Tamu");
}
echo sapaPengguna("Budi"), "\n";
echo sapaPengguna(null), "\n";Output yang Dihasilkan:
Halo, Budi
Halo, TamuParameter $nama bertipe ?string menerima string maupun null. Di dalam fungsi, operator ?? memilih "Tamu" ketika argumen bernilai null. Pola tanda tanya ini sangat umum di Laravel — misalnya method Request::duplicate(?array $query = null, ?array $request = null, ...) pada kode sumber framework — karena banyak nilai memang boleh kosong.
Parameter Variadic #
Tanda ...$nama membuat parameter menampung argumen dalam jumlah berapa pun sebagai array:
<?php
function jumlahkan(int ...$angka): int
{
return array_sum($angka);
}
echo jumlahkan(10, 20, 30), "\n";
echo jumlahkan(1, 2, 3, 4, 5), "\n";Output yang Dihasilkan:
60
15Kedua pemanggilan di atas sah: PHP mengumpulkan argumen 10, 20, 30 menjadi array [10, 20, 30] di dalam $angka, lalu array_sum() menjumlahkan seluruh elemennya. Framework sendiri memakai pola variadic pada beberapa helper-nya, misalnya throw_if($condition, $exception = 'RuntimeException', ...$parameters) yang meneruskan argumen sisanya ke constructor exception.
Arrow Function fn() => #
Arrow function adalah fungsi pendek satu ekspresi dengan sintaks fn(argument) => ekspresi. Dua keunggulannya: ringkas, dan otomatis menangkap variabel luar tanpa use:
<?php
$diskon = 0.1;
$hitungBayar = fn (int $total): int => $total - ($total * $diskon);
echo $hitungBayar(150000), "\n";
$daftarHarga = [50000, 125000, 300000];
$hargaFinal = array_map(fn ($h) => $h - ($h * $diskon), $daftarHarga);
echo implode(", ", $hargaFinal), "\n";Output yang Dihasilkan:
135000
45000, 112500, 270000Arrow function $hitungBayar membaca variabel $diskon dari lingkup luar tanpa deklarasi tambahan — automatic capture. Pada baris array_map, setiap elemen $daftarHarga dikurangi diskon sepuluh persen; array_map memanggil arrow function tersebut satu kali per elemen.
Fungsi sebagai Nilai #
Fungsi PHP adalah first-class citizen: fungsi bisa disimpan ke variabel, dikirim sebagai argumen, dan dikembalikan dari fungsi lain. Parameter bertipe callable menandakan posisi yang menerima fungsi:
<?php
$buatLabel = function (string $status): string {
return "[" . strtoupper($status) . "]";
};
function terapkan(array $data, callable $transformasi): array
{
$hasil = [];
foreach ($data as $item) {
$hasil[] = $transformasi($item);
}
return $hasil;
}
$status = ["aktif", "nonaktif"];
echo implode(" ", terapkan($status, $buatLabel)), "\n";
echo implode(" | ", terapkan($status, fn ($s) => "status: $s")), "\n";Output yang Dihasilkan:
[AKTIF] [NONAKTIF]
status: aktif | status: nonaktifFungsi terapkan() sama sekali tidak tahu transformasi apa yang diterimanya — fungsi tersebut hanya memanggil $transformasi($item) untuk setiap elemen. Pemanggilan pertama mengirim anonymous function $buatLabel, pemanggilan kedua mengirim arrow function. Pola “mengirim perilaku sebagai argumen” ini adalah inti cara Laravel memproses data.
Arrow Function di Route Laravel #
Berikut wujud pola tersebut di aplikasi nyata — route Laravel yang kita uji langsung di sandbox Course ini:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/ping', fn () => response()->json(['status' => 'ok']));Output yang Dihasilkan:
HTTP 200
{"status":"ok"}Closure fn () => ... dijadikan argumen kedua Route::get(). Ketika permintaan GET /ping datang, router memanggil closure tersebut dan response JSON dikembalikan dengan status HTTP 200. Seluruh pipeline framework — dari routing sampai middleware — memindahkan fungsi-fungsi kecil seperti ini.
Fungsi-fungsi di atas kini siap menjadi alat kerja kita, dan pola closure-nya akan terus muncul di sepanjang Course ini. Kendati demikian, sebagian besar data yang berpindah di dalam Laravel berbentuk array — struktur yang menjadi fokus chapter berikutnya.