Fungsi — PHP

Fungsi membantu mengorganisir kode menjadi blok yang bisa dipakai ulang. Deklarasi fungsi: function sapa($nama) { return "Halo, $nama!"; } echo sapa("Budi")…

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 dengan echo hitung(2, 3);. Yang keluar 5, 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

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

<?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
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

📌 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

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.

Yang akan kamu pelajari