Fungsi dengan banyak parameter opsional adalah pemandangan umum: tarif pajak yang hampir selalu 11 persen, salam pembuka yang hampir selalu Halo, domain email yang hampir selalu example.com. Memaksa pemanggil menulis nilai yang sama berulang-ulang membuat kode bising dan rawan salah ketik. Default parameters membiarkan definisi fungsi menyediakan nilai cadangan: parameter yang tidak diisi pemanggil otomatis memakai nilai bawaan tersebut. Pada chapter ini kita pelajari aturan penulisannya, jebakan urutannya, dan pola null sebagai penanda “gunakan nilai bawaan internal”.
Memberi Nilai Default pada Parameter #
Nilai default ditulis dengan operator penugasan biasa, tepat setelah nama parameter:
<?php
function sapa($nama, $salam = "Halo")
{
return "$salam, $nama!";
}
echo sapa("Budi") . "\n";
echo sapa("Siti", "Selamat pagi") . "\n";Output yang Dihasilkan:
Halo, Budi!
Selamat pagi, Siti!Mari kita bedah dua pemanggilannya:
- Baris 7: argument tunggal
"Budi"mengisi$nama; karena$salamtidak diisi, parameter tersebut memakai default"Halo". - Baris 8: dua argument dikirim — default
"Halo"digantikan oleh"Selamat pagi".
Nilai default dievaluasi sekali pada saat penerjemahan berkas, bukan setiap kali fungsi dipanggil. Konsekuensinya, isi default harus sudah bisa ditentukan tanpa menjalankan program — dan di situlah letak aturan berikutnya.
Default Harus Berupa Ekspresi Konstan #
Karena dievaluasi saat penerjemahan, nilai default hanya boleh berupa ekspresi konstan: literal, konstanta, operator, dan array literal. Dua pola yang paling sering dipakai:
<?php
const ONGKIR_DEFAULT = 10000;
function hitungTotalBelanja($hargaBarang, $ongkir = ONGKIR_DEFAULT)
{
return $hargaBarang + $ongkir;
}
echo hitungTotalBelanja(75000) . "\n";
echo hitungTotalBelanja(75000, 20000) . "\n";Output yang Dihasilkan:
85000
95000<?php
function buatProfil($nama, $hobi = ["membaca", "menulis"])
{
return $nama . " suka " . implode(" dan ", $hobi);
}
echo buatProfil("Budi") . "\n";
echo buatProfil("Siti", ["ngoding"]) . "\n";Output yang Dihasilkan:
Budi suka membaca dan menulis
Siti suka ngodingPada contoh pertama, konstanta ONGKIR_DEFAULT yang dideklarasikan const dibaca sebagai nilai default — satu sumber kebenaran yang juga bisa dipakai di tempat lain. Pada contoh kedua, array literal ["membaca", "menulis"] adalah ekspresi konstan yang sah, sehingga pemanggil yang tidak mengirim $hobi mendapat array dua elemen itu, sedangkan pemanggil kedua menggantinya dengan array sendiri.
Variabel tidak memenuhi syarat ini — nilai variabel baru diketahui saat eksekusi berjalan:
<?php
$ongkirDefault = 10000;
function hitungTotalBelanja($hargaBarang, $ongkir = $ongkirDefault)
{
return $hargaBarang + $ongkir;
}Output yang Dihasilkan:
Fatal error: Constant expression contains invalid operations in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php on line 4Pesan Constant expression contains invalid operations menolak $ongkirDefault sebagai nilai default sebelum eksekusi dimulai — nama berkas .verify_tmp.php pada pesan berasal dari alat verifikasi contoh kode buku ini. Solusinya dua macam: angkat nilai itu menjadi konstanta dengan const atau define(), atau jadikan parameternya wajib lalu tangani kondisi kosong di dalam badan fungsi.
Parameter Nullable dengan Default null #
Bentuk khusus yang sangat umum: parameter opsional yang boleh null. Polanya menggabungkan type declaration ?, nilai default null, dan pemeriksaan di badan fungsi:
<?php
function buatEmailPengguna(string $nama, ?string $domain = null): string
{
if ($domain === null) {
$domain = "example.com";
}
return strtolower($nama) . "@" . $domain;
}
echo buatEmailPengguna("Budi") . "\n";
echo buatEmailPengguna("Siti", "mail.example.id") . "\n";Output yang Dihasilkan:
Mari kita bedah elemen kuncinya:
- Baris 2:
string $namaadalah parameter wajib bertipe string — type declaration baru sekilas kita pakai di sini; pembahasan penuhnya menunggu chapter Parameter Types . ?string $domain = null: parameter ini boleh berisi string ataunull, dan default-nyanull. Tanda?wajib eksplisit — menulisstring $domain = nulltanpa?memicu peringatan deprecation di PHP 8.4 karena parameter implicitly nullable.- Baris 4-6: bila
null, fungsi memakai fallbackexample.com— pemeriksaan$domain === null(atauis_null($domain)) menjadi sinyal bahwa pemanggil tidak menentukan.
Satu jebakan penting dari pola ini: mengirim null secara eksplisit tidak memakai default — null benar-benar mengisi parameter:
<?php
function sapa($nama, $salam = "Halo")
{
return "$salam, $nama!";
}
$hasil = sapa("Budi", null);
var_dump($hasil);Output yang Dihasilkan:
string(7) ", Budi!"Hasilnya string(7) ", Budi!" — parameter $salam berisi null, bukan default "Halo", sehingga bagian salam menjadi kosong dan yang tercetak hanyalah koma beserta nama. Perilaku ini berbeda dari sekadar tidak mengirim argument sama sekali.
Parameter Wajib Mendahului yang Opsional #
Sejak PHP 8.0, parameter wajib yang ditulis setelah parameter ber-default memicu peringatan deprecation: PHP memperlakukan parameter ber-default di depannya sebagai wajib juga:
<?php
function buatPesanan($menu = "Nasi Goreng", $jumlah)
{
return "$jumlah porsi $menu";
}
echo "berkas berhasil dikompilasi\n";Output yang Dihasilkan:
Deprecated: buatPesanan(): Optional parameter $menu declared before required parameter $jumlah is implicitly treated as a required parameter in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php on line 2
berkas berhasil dikompilasiPerhatikan dua hal pada keluarannya. Pertama, peringatan Deprecated muncul begitu berkas diproses — meskipun fungsinya belum dipanggil — karena pemeriksaan terjadi di tahap penerjemahan. Kedua, program tetap berjalan hingga selesai: deprecation adalah peringatan, bukan penghenti eksekusi. Namun begitu fungsi dipanggil dengan argument kurang, fatal error menghantam:
<?php
function buatPesanan($menu = "Nasi Goreng", $jumlah)
{
return "$jumlah porsi $menu";
}
echo buatPesanan(2) . "\n";Output yang Dihasilkan:
Deprecated: buatPesanan(): Optional parameter $menu declared before required parameter $jumlah is implicitly treated as a required parameter in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php on line 2
Fatal error: Uncaught ArgumentCountError: Too few arguments to function buatPesanan(), 1 passed in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php on line 7 and exactly 2 expected in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php:2
Stack trace:
#0 /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php(7): buatPesanan(2)
#1 {main}
thrown in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php on line 2PHP menuntut tepat dua argument untuk buatPesanan() meski $menu memiliki default — itulah makna frasa implicitly treated as a required parameter pada pesan deprecation-nya. Solusinya sederhana: susun ulang urutannya sehingga parameter wajib selalu di depan:
<?php
function buatPesanan($jumlah, $menu = "Nasi Goreng")
{
return "$jumlah porsi $menu";
}
echo buatPesanan(2) . "\n";
echo buatPesanan(3, "Mie Ayam") . "\n";Output yang Dihasilkan:
2 porsi Nasi Goreng
3 porsi Mie AyamDengan urutan yang benar, pemanggilan satu argument kini masuk akal: 2 mengisi $jumlah yang wajib, sementara $menu memakai default-nya.
Interaksi Default dengan Parameter Variadic #
Parameter variadic ...$angkaLain boleh dikombinasikan dengan default pada parameter biasa di depannya:
<?php
function jumlahkanSemua($nilaiAwal = 0, ...$angkaLain)
{
return $nilaiAwal + array_sum($angkaLain);
}
echo jumlahkanSemua() . "\n";
echo jumlahkanSemua(10) . "\n";
echo jumlahkanSemua(10, 1, 2, 3) . "\n";Output yang Dihasilkan:
0
10
16Tiga pemanggilannya menunjukkan kerja sama kedua fitur: tanpa argument, $nilaiAwal memakai default 0 dan $angkaLain menjadi array kosong sehingga hasilnya 0; dengan satu argument, 10 mengisi $nilaiAwal; dengan empat argument, tiga nilai terakhir dikumpulkan menjadi array di $angkaLain lalu dijumlahkan array_sum() menjadi 16.
Kebalikannya tidak sah — parameter variadic sendiri tidak boleh diberi default:
<?php
function jumlahkanSemua(...$angka = [])
{
return array_sum($angka);
}Output yang Dihasilkan:
Fatal error: Variadic parameter cannot have a default value in /home/z/my-project/php-course/content/php/fungsi/default-parameters/.verify_tmp.php on line 2Parameter variadic sudah opsional secara desain: ia melonggarkan diri menjadi array kosong saat tidak ada argument tambahan, sehingga default tidak punya makna. Mekanisme lengkap ...$param — mengumpulkan argument tak terbatas — kita tuntaskan pada chapter Variadic Functions
.
Ringkasan #
Nilai default membuat parameter opsional: yang tak diisi pemanggil memakai cadangan dari definisi. Default wajib berupa ekspresi konstan, parameter wajib harus mendahului yang opsional, dan pola ?type $x = null memberi ruang bagi fallback di badan fungsi. Default parameters meredakan kebisingan pemanggilan rutin, tetapi fungsi dengan banyak parameter opsional masih menyisakan satu gesekan: untuk mengisi satu parameter di posisi akhir, pemanggil harus menyebut semua posisi sebelumnya. PHP 8.0 menjawabnya dengan named arguments — chapter berikutnya.