Bayangkan fungsi konfigurasi dengan delapan parameter opsional, lalu Anda hanya ingin mengubah yang kelima. Dengan argument posisional, Anda terpaksa menulis empat nilai persis seperti default hanya untuk sampai ke target — dan salah hitung satu posisi berarti nilai nyasar ke parameter yang keliru. Named arguments, hadir sejak PHP 8.0, mengizinkan pemanggil menyebut nama parameter secara eksplisit: nilai dikirim ke nama yang dituju, bukan sekadar ke posisi kosong berikutnya. Pada chapter ini kita pelajari sintaksnya, aturan penggabungannya dengan argument posisional, dan penerapannya pada fungsi bawaan PHP.

Sintaks Nama Titik Dua Nilai #

Pola penulisannya sederhana: nama parameter, titik dua, lalu nilai. Contoh berikut memakai fungsi penyusun pesanan kopi:

php
<?php
function buatKopi($jenis, $gula = 0, $susu = false)
{
    $rincian = [$jenis];
    $rincian[] = $gula > 0 ? "$gula sendok gula" : "tanpa gula";
    $rincian[] = $susu ? "dengan susu" : "tanpa susu";

    return implode(", ", $rincian);
}

echo buatKopi("Americano") . "\n";
echo buatKopi(jenis: "Latte", susu: true) . "\n";

Output yang Dihasilkan:

text
Americano, tanpa gula, tanpa susu
Latte, tanpa gula, dengan susu

Mari kita bedah dua pemanggilan pada baris 11-12:

  1. Baris 11: pemanggilan posisional biasa — $jenis diisi "Americano", dua parameter lainnya memakai default.
  2. Baris 12: jenis: "Latte" mengisi $jenis lewat nama, dan susu: true mengisi $susu lewat nama; keduanya dipisah koma seperti argument biasa. Parameter $gula tidak disebut, sehingga memakai default 0.

Melompati Parameter Opsional #

Keunggulan utama named arguments: pemanggil tidak perlu menyentuh parameter yang tidak relevan, dan urutan penulisan antar named arguments bebas:

php
<?php
function buatPesanan($menu, $jumlah = 1, $levelPedas = 1, $catatan = "-")
{
    return "$jumlah porsi $menu (level pedas $levelPedas, catatan: $catatan)";
}

echo buatPesanan("Mie Ayam") . "\n";
echo buatPesanan("Mie Ayam", catatan: "tanpa bawang") . "\n";
echo buatPesanan(menu: "Sate Ayam", levelPedas: 3, jumlah: 2) . "\n";

Output yang Dihasilkan:

text
1 porsi Mie Ayam (level pedas 1, catatan: -)
1 porsi Mie Ayam (level pedas 1, catatan: tanpa bawang)
2 porsi Sate Ayam (level pedas 3, catatan: -)

Tiga pemanggilan pada baris 7-9 memperlihatkan lenturnya:

  1. Baris 7: pemanggilan minimal — satu-satunya argument adalah $menu yang wajib, tiga default lainnya aktif.
  2. Baris 8: hanya $catatan yang diubah menjadi "tanpa bawang"; $jumlah dan $levelPedas yang berada di antaranya tidak perlu disentuh sama sekali. Dengan cara posisional, kita harus menulis buatPesanan("Mie Ayam", 1, 1, "tanpa bawang").
  3. Baris 9: tiga named arguments ditulis dalam urutan berbeda dari deklarasinya — hasil tetap benar karena pengikatan dilakukan berdasarkan nama, bukan posisi.

Menggabungkan Posisional dan Named #

Kedua gaya boleh dipakai dalam satu pemanggilan dengan satu aturan tegas: semua argument posisional harus mendahului named arguments:

php
<?php
function buatKopi($jenis, $gula = 0, $susu = false)
{
    $rincian = [$jenis];
    $rincian[] = $gula > 0 ? "$gula sendok gula" : "tanpa gula";
    $rincian[] = $susu ? "dengan susu" : "tanpa susu";

    return implode(", ", $rincian);
}

echo buatKopi("Latte", susu: true) . "\n";
echo buatKopi("Torabika", 2, susu: true) . "\n";

Output yang Dihasilkan:

text
Latte, tanpa gula, dengan susu
Torabika, 2 sendok gula, dengan susu

Baris 11 mengisi $jenis secara posisional lalu $susu lewat nama, sementara $gula memakai default. Baris 12 mengisi dua parameter pertama secara posisional dan yang ketiga lewat nama — keduanya sah karena bagian posisional selalu di depan. Membalik urutannya ditolak:

php
<?php
function buatKopi($jenis, $gula = 0, $susu = false)
{
    $rincian = [$jenis];
    $rincian[] = $gula > 0 ? "$gula sendok gula" : "tanpa gula";
    $rincian[] = $susu ? "dengan susu" : "tanpa susu";

    return implode(", ", $rincian);
}

echo buatKopi(jenis: "Latte", 2) . "\n";

Output yang Dihasilkan:

text

Fatal error: Cannot use positional argument after named argument in /home/z/my-project/php-course/content/php/fungsi/named-arguments/.verify_tmp.php on line 11

Pesan Cannot use positional argument after named argument muncul karena begitu satu argument diberi nama, PHP tidak lagi bisa menebak posisi argument anonim yang menyusulnya. Nama berkas .verify_tmp.php pada pesan berasal dari alat verifikasi contoh kode buku ini; berkas simpanan Anda sendiri akan tertulis dengan namanya.

Named Arguments pada Fungsi Bawaan #

Manfaat named arguments paling terasa pada fungsi bawaan yang daftar parameternya panjang. htmlspecialchars() — fungsi pengaman keluaran HTML — menyembunyikan saklar double_encode bukan di posisi pertama; named arguments membuatnya mudah dijangkau:

php
<?php
$teks = "Budi & Siti memakai tag <b>PHP</b> &amp; HTML";

echo htmlspecialchars($teks) . "\n";
echo htmlspecialchars($teks, double_encode: false) . "\n";

Output yang Dihasilkan:

text
Budi &amp; Siti memakai tag &lt;b&gt;PHP&lt;/b&gt; &amp;amp; HTML
Budi &amp; Siti memakai tag &lt;b&gt;PHP&lt;/b&gt; &amp; HTML

Kedua pemanggilan mengamankan karakter khusus menjadi entitas HTML: & menjadi &amp;, < menjadi &lt;, dan > menjadi &gt;. Bedanya, baris kelima mematikan pengodean ganda: entitas &amp; yang sudah ada pada input tidak dikodekan ulang menjadi &amp;amp;. Tanpa named arguments, kita harus mengisi lebih dulu parameter-parameter yang berada sebelum double_encode — lengkap dengan nilai defaultnya yang harus disalin dari dokumentasi — hanya untuk sampai ke satu saklar itu.

Fungsi round() memberi contoh yang lebih ringkas:

php
<?php
$phi = 3.14159;

echo round($phi, precision: 2) . "\n";
echo round($phi, precision: 0) . "\n";

Output yang Dihasilkan:

text
3.14
3

Parameter kedua round() bernama $precision; menulis round($phi, precision: 2) menyatakan maksudnya secara gamblang, sementara round($phi, 2) memaksa pembaca menebak sendiri arti angka 2 itu.

Nama Harus Persis sama dengan Parameternya #

Nama pada named arguments harus persis sama dengan nama parameter pada definisi; satu huruf keliru membuat PHP melempar Error:

php
<?php
function buatKopi($jenis, $gula = 0, $susu = false)
{
    $rincian = [$jenis];
    $rincian[] = $gula > 0 ? "$gula sendok gula" : "tanpa gula";
    $rincian[] = $susu ? "dengan susu" : "tanpa susu";

    return implode(", ", $rincian);
}

echo buatKopi(jenis: "Latte", susuu: true) . "\n";

Output yang Dihasilkan:

text

Fatal error: Uncaught Error: Unknown named parameter $susuu in /home/z/my-project/php-course/content/php/fungsi/named-arguments/.verify_tmp.php:11
Stack trace:
#0 {main}
  thrown in /home/z/my-project/php-course/content/php/fungsi/named-arguments/.verify_tmp.php on line 11

Pesan Unknown named parameter $susuu muncul karena parameter bernama $susuu memang tidak ada pada definisi buatKopi() — maksud kita jelas $susu. Berbeda dari nama fungsi yang case-insensitive, nama pada named arguments mengikuti nama parameter secara persis, jadi salin nama tepat seperti yang tertera pada signature atau dokumentasi fungsinya.

Konsekuensi desain yang lebih luas: nama parameter kini menjadi bagian dari kontrak publik sebuah fungsi. Pengelola library yang sembarangan mengganti nama parameter bisa merusak seluruh kode pemanggil milik penggunanya, meski isi fungsinya tidak berubah — itulah mengapa penggantian nama parameter pada API publik selalu perlu dibarengi pertimbangan kompatibilitas.

Ringkasan #

Named arguments mengisi parameter berdasarkan nama: pemanggil bisa melompati parameter opsional yang tidak relevan, menggabungkan gaya posisional-named dengan aturan posisional di depan, dan menjangkau parameter dalam-dalam pada fungsi bawaan tanpa menyalin default satu per satu. Ketebalan kontraknya juga jelas — nama parameter menjadi bagian resmi dari antarmuka fungsi. Pertanyaan berikutnya: bagaimana bila jumlah argument sendiri tidak pasti — kadang dua, kadang sepuluh? Fungsi variadic menjawabnya, dan itulah chapter berikutnya.

Referensi #