Fungsi adalah blok kode yang diberi nama, supaya bisa dipanggil berkali-kali dengan isian yang berbeda. Bayangin kartu resep di dapur Warung Bu Tini: "Hitung total: harga dikali jumlah porsi." Resepnya ditulis sekali. Tiap ada pesanan, Bu Tini memakai resep yang sama dengan angka pesanan itu, lalu hasilnya diserahkan ke kasir. Di pelajaran Type System kamu sudah melihat totalHarga sekilas. Di sini kita bongkar cara kerjanya.
🧪 Tebakan cepat: Fungsi
function hitung(int $a, int $b): int { $a + $b; }dipanggil denganecho hitung(2, 3);. Yang keluar5, kosong, atau error? Tebak dulu, jawabannya ada di bagian "return: hasil yang dikirim keluar".
Bikin dan panggil fungsi
<?php
function totalHarga(int $harga, int $jumlah): int {
return $harga * $jumlah;
}
echo totalHarga(15000, 2) . "\n"; // 30000
echo totalHarga(5000, 3); // 15000
function totalHarga(...)membuat fungsi bernamatotalHarga. Kodenya belum jalan, baru disimpan.$hargadan$jumlahadalah parameter: variabel yang menunggu diisi saat fungsinya dipanggil.intdi depannya tipe yang boleh masuk, dan: intsesudah kurung tipe hasilnya, seperti di Type System.- Isi fungsi ada di antara
{ }. totalHarga(15000, 2)memanggil fungsinya. Nilai di dalam kurung,15000dan2, disebut argumen.
Ini yang terjadi saat totalHarga(15000, 2) dipanggil:
| Langkah | Yang terjadi |
|---|---|
| 1 | $harga diisi 15000, $jumlah diisi 2, urut sesuai posisinya |
| 2 | return $harga * $jumlah menghitung 30000 dan mengirimnya keluar |
| 3 | echo mencetak 30000 di tempat fungsinya dipanggil |
Satu resep, banyak pesanan: panggilan kedua mengisi $harga dengan 5000 dan $jumlah dengan 3, jadi hasilnya 15000.
return: hasil yang dikirim keluar
returnmengakhiri fungsi dan mengirim nilainya ke tempat fungsi itu dipanggil. Baris sesudahreturngak dijalankan.- Tanpa
return, fungsi mengembalikannull. Kalau tipe hasilnya sudah ditulis: int, PHP menolak:
<?php
function hitung(int $a, int $b): int {
$a + $b;
}
echo hitung(2, 3);
Fatal error: Uncaught TypeError: hitung(): Return value must be of type int, none returned in /app/kasir.php:4
$a + $b; memang dihitung, tapi hasilnya dibuang karena gak di-return. Tanpa : int, yang tercetak cuma kosong. Itu jawaban tebakannya: tulis return $a + $b;.
echo di dalam fungsi juga bukan pengganti return. Fungsi yang cuma meng-echo memang mencetak, tapi $total = cetakTotal(15000, 2); berisi null, jadi hasilnya gak bisa dipakai lagi. Biasakan: fungsi me-return, dan echo dilakukan di luar.
Parameter default dan named argument
<?php
function totalHarga(int $harga, int $jumlah = 1): int {
return $harga * $jumlah;
}
echo totalHarga(15000) . "\n"; // 15000
echo totalHarga(15000, 2) . "\n"; // 30000
echo totalHarga(jumlah: 3, harga: 5000); // 15000
$jumlah = 1adalah nilai default: dipakai kalau argumennya gak dikirim. Parameter yang punya default ditaruh sesudah yang gak punya.jumlah: 3, harga: 5000adalah named argument (PHP 8): argumen dikirim dengan nama parameternya, jadi urutannya bebas. Nama yang salah, misalnyaporsi: 2, ditolak denganError: Unknown named parameter $porsi.- Argumen yang wajib tapi gak dikirim memunculkan
ArgumentCountError:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function totalHarga(), 0 passed in /app/kasir.php on line 6 and at least 1 expected in /app/kasir.php:2
Default juga berlaku untuk teks: function salam($nama = "Dunia") { return "Halo $nama"; } membuat salam() mengembalikan Halo Dunia.
Variabel di dalam dan di luar fungsi
<?php
$diskon = 2000;
function hargaAkhir($harga) {
return $harga - $diskon;
}
echo hargaAkhir(15000);
Warning: Undefined variable $diskon in /app/kasir.php on line 5
15000
Fungsi cuma melihat parameternya dan variabel yang dibuat di dalamnya sendiri (ini disebut scope). $diskon di luar gak kelihatan, jadi dianggap null dan dikurangi 0. Kirim lewat parameter: function hargaAkhir($harga, $diskon).
Arrow function dan closure
Fungsi juga bisa dibuat tanpa nama dan disimpan di variabel. Bentuk ini sering dikirim ke fungsi lain, misalnya ke array_map di pelajaran Array Lanjutan.
<?php
$ongkir = 5000;
$tambahOngkir = fn($total) => $total + $ongkir;
$catatOngkir = function ($total) use ($ongkir) {
return $total + $ongkir;
};
echo $tambahOngkir(30000) . "\n"; // 35000
echo $catatOngkir(30000); // 35000
fn($total) => ...adalah arrow function: isinya satu ekspresi, hasilnya otomatis di-return (tanpa katareturn), dan dia boleh membaca variabel luar seperti$ongkirbegitu saja.function ($total) use ($ongkir) { ... }adalah closure: isinya boleh beberapa baris dan butuhreturn, dan variabel luar yang dipakai harus disebut diuse.- Keduanya menyalin nilai
$ongkirsaat dibuat. Kalau sesudahnya$ongkir = 8000;, hasil keduanya tetap 35000.
📌 Variadic: jumlah argumen bebas
function jumlahkan(int ...$harga): int {
return array_sum($harga);
}
echo jumlahkan(15000, 5000, 2000); // 22000
...$harga mengumpulkan semua argumen yang dikirim jadi satu array, berapa pun jumlahnya.
⚠️ Jebakan yang sering ketemu
- Lupa
return. Hasilnya dihitung lalu dibuang. Dengan: int, PHP berhenti denganReturn value must be of type int, none returned. echopadahal maksudnyareturn. Teksnya tercetak, tapi nilai fungsinyanull, jadi gak bisa disimpan atau dihitung lagi.- Memakai variabel luar di fungsi biasa. Fungsi gak melihat
$diskondi luar. Kirim lewat parameter, atau pakaiusedi closure. - Argumen kurang. Parameter tanpa default wajib dikirim, kalau gak,
ArgumentCountError.
TL;DR: function nama($param) { return ...; } membuat fungsi, nama(argumen) memanggilnya, dan argumen mengisi parameter sesuai urutan atau sesuai nama (jumlah: 3). return mengirim hasilnya keluar; tanpa return hasilnya null, dan dengan : int jadi TypeError. $jumlah = 1 adalah default untuk argumen yang gak dikirim. Fungsi cuma melihat parameternya sendiri. fn($x) => ekspresi otomatis me-return dan membaca variabel luar; function ($x) use ($y) { return ...; } butuh use dan return.