fungsilanjutanPemula4 mnt baca

Fungsi Lanjutan

Variadic, anonymous function, closure dengan use, dan arrow function.

Analogi: Resep dengan Aturan Ketat

Fungsi dasar seperti resep rumahan: fleksibel, takaran "secukupnya". Fungsi lanjutan seperti resep industri: bahan ditimbang presisi, ada label "untuk berapa porsi", dan mesin menolak bahan yang salah. Di PHP modern, kamu bisa memberi tipe pada parameter dan return value agar fungsi menolak input yang salah sejak awal, bukan meledak di tengah jalan.

Kenapa Pengetatan Ini Ada?

Fungsi tanpa tipe adalah kotak hitam: pemanggil tidak tahu boleh mengirim apa, dan fungsi tidak tahu apa yang akan datang. Akibatnya bug muncul jauh dari sumbernya ("kenapa totalnya 0?" ternyata yang dikirim string kosong dari 5 pemanggilan sebelumnya). Type declaration memindahkan pengecekan ke pintu masuk: salah tipe langsung error jelas di baris pemanggilan.

php
<?php
// Contoh 1: type declaration untuk parameter dan return
function hitungDiskon(float $harga, float $persen): float {
    return $harga - ($harga * $persen / 100);
}

echo hitungDiskon(100000, 10);      // 90000, jalan normal
// echo hitungDiskon("seratus ribu", 10);  // TypeError: jelas salahnya di sini!

: float setelah kurung adalah janji "fungsi ini mengembalikan float". Kalau input bukan angka, PHP melempar TypeError dengan pesan yang menunjuk baris pemanggil. Bandingkan dengan fungsi tanpa tipe yang diam-diam menghasilkan 0 karena juggling.

php
<?php
// Contoh 2: named arguments dan variadic (PHP 8)
// Named arguments: panggil dengan nama parameter, urutan bebas
function buatUser(string $nama, string $role = "member", bool $aktif = true): string {
    return "$nama ($role)" . ($aktif ? " aktif" : " nonaktif");
}

echo buatUser(nama: "Sinta", aktif: false);
// Hasil: Sinta (member) nonaktif. Jelas tanpa harus hafal urutan!

// Variadic: terima BANYAK argumen sekaligus
function total(...$angka): int {
    return array_sum($angka);
}
echo total(10, 20, 30, 40);   // 100: semua argumen ditampung ke array $angka

Named arguments menyelamatkanmu dari bug "salah urutan argumen" pada fungsi dengan banyak parameter opsional. Variadic (...$angka) berguna untuk fungsi seperti total() atau rataRata() yang jumlah inputnya tidak pasti.

Kesalahan Umum Pemula

Salah: type declaration tapi tetap mengirim string angka tanpa sadar.

php
<?php
declare(strict_types=1);

function tambah(int $a, int $b): int {
    return $a + $b;
}
echo tambah("3", "4");   // TypeError dalam mode strict!

Tanpa declare(strict_types=1), PHP masih "baik hati" mengubah "3" menjadi 3. Dengan strict mode, konversi otomatis dimatikan dan "3" ditolak. Pelajaran: strict mode bagus untuk menangkap bug, tapi pastikan datamu memang sudah bertipe benar (casting dulu dari input form).

Salah: menaruh parameter default sebelum parameter wajib.

php
<?php
// SALAH: PHP tidak tahu $role diisi apa saat dipanggil buatUser("Sinta")
function buatUser(string $nama = "Tamu", string $role): string {

Benar: parameter ber-default selalu di belakang: function buatUser(string $role, string $nama = "Tamu"). Aturan ini mencegah ambiguitas urutan argumen.

Salah: mengira return type menjamin isi, bukan hanya tipe.

php
<?php
function cariUser(int $id): array {
    return [];   // valid secara tipe, tapi kosong!
}

: array hanya menjamin tipenya array, bukan isinya ada. Validasi isi (tidak kosong, kunci lengkap) tetap tanggung jawab logikamu di dalam fungsi.

Kapan Memakai Fitur Apa?

  • Type declaration: selalu, untuk semua fungsi baru. Gratis, menangkap bug di pintu masuk.
  • strict_types=1: untuk library dan kode kritis. Untuk kode aplikasi biasa, mode longgar (default) masih acceptable selama kamu casting input luar.
  • Named arguments: saat fungsi punya 3+ parameter atau banyak default. Menghindari bug urutan.
  • Variadic: untuk fungsi agregat (total(), gabung()) yang jumlah argumennya fleksibel.
  • Arrow function: untuk callback satu baris di array_map/array_filter. Untuk logika multi-baris, closure biasa lebih terbaca.

Satu peringatan: jangan campur named dan positional secara membingungkan. buatUser("Sinta", role: "admin") boleh (positional dulu, named kemudian), tapi buatUser(nama: "Sinta", "admin") error: positional tidak boleh setelah named.

Catatan teknis: Arrow function fn($x) => $x * 2 adalah fungsi satu baris (PHP 7.4+), favorit untuk callback di array_map/array_filter. Berbeda dengan closure biasa, arrow function otomatis "melihat" variabel di sekitarnya tanpa perlu use.

Tantangan

Filter dengan closure

Buat array $nilai = [55, 80, 90, 45, 75]. Dengan array_filter + arrow function, ambil hanya nilai >= 70. Tampilkan hasilnya dengan print_r.