Sejauh ini setiap fungsi yang kita tulis menerima jumlah parameter yang pasti: dua angka untuk penjumlahan, satu nama untuk sapaan. Di dunia nyata sering kali jumlah masukan tidak bisa ditentukan di muka — jumlah item keranjang belanja, tag artikel yang dikirim pengguna, atau nilai yang ingin dicatat ke log. PHP menyediakan variadic functions untuk menangani kasus ini: satu parameter khusus yang sanggup menampung argumen sebanyak apa pun, termasuk nol.

Mengumpulkan Argumen dengan Tanda Titik Tiga #

Parameter variadic ditulis dengan awalan tiga titik (...) di depan nama variabel. Saat fungsi dipanggil, PHP mengumpulkan semua argumen yang tersisa ke dalam satu array, lalu mengikat array tersebut ke parameter itu. Karena hasilnya berupa array, kita bisa langsung memakai fungsi array seperti array_sum() dan count().

php
<?php
function jumlahkan(int ...$angka): int
{
    return array_sum($angka);
}

echo jumlahkan(1, 2, 3) . "\n";
echo jumlahkan(10, 20, 30, 40) . "\n";
echo jumlahkan() . "\n";

Output yang Dihasilkan:

text
6
100
0

Mari kita bedah contoh di atas baris per baris:

  1. Baris 2 (function jumlahkan(int ...$angka): int): parameter $angka bertanda ... sehingga menjadi penampung variadic; kata int sebelum titik tiga memastikan setiap argumen yang masuk adalah integer.
  2. Baris 4 (return array_sum($angka);): array_sum() menjumlahkan seluruh isi array tanpa perlu loop manual.
  3. Baris 7-9: pemanggilan dengan tiga argumen menghasilkan 6, dengan empat argumen menghasilkan 100, dan tanpa argumen sama sekali menghasilkan 0 karena array_sum([]) bernilai 0.

Di dalam fungsi, $angka adalah array biasa — anda dapat memanggil count($angka), mengiterasinya dengan foreach, atau mengindeks $angka[0]. Tanda ... hanya berperan pada saat pemanggilan; setelah argumen terkumpul, tidak ada lagi yang spesial dari parameter tersebut.

Variadic Bersama Parameter Biasa #

Parameter variadic boleh dikombinasikan dengan parameter biasa asalkan posisinya paling belakang. Parameter biasa di depan diisi lebih dulu, lalu sisa argumen mengalir ke parameter variadic. Pola ini umum untuk fungsi yang butuh satu nilai wajib ditambah daftar opsional.

php
<?php
function buatPesan(string $sapaan, string ...$nama): string
{
    return $sapaan . ", " . implode(" dan ", $nama) . "!";
}

echo buatPesan("Halo", "Budi", "Siti") . "\n";
echo buatPesan("Selamat pagi", "Budi") . "\n";

Output yang Dihasilkan:

text
Halo, Budi dan Siti!
Selamat pagi, Budi!

Pada pemanggilan pertama, "Halo" masuk ke $sapaan sedangkan "Budi" dan "Siti" terkumpul di $nama sebagai ["Budi", "Siti"]. Fungsi implode(" dan ", $nama) kemudian merekatkan kedua nama menjadi "Budi dan Siti". Jika hanya satu nama yang dikirim, implode() mengembalikan nama tersebut apa adanya sehingga hasilnya tetap wajar.

Membongkar Array dengan Spread Operator #

Tanda titik tiga punya peran kedua di sisi pemanggilan, disebut spread operator. Jika kita sudah memiliki nilai dalam bentuk array, f(...$array) membongkar array tersebut menjadi argumen satu per satu — kebalikan dari pengumpulan yang terjadi di parameter. Fitur ini menghindari penulisan $array[0], $array[1], $array[2] secara manual.

php
<?php
function jumlahkan(int ...$angka): int
{
    return array_sum($angka);
}

function perkenalkan(string $nama, int $umur): string
{
    return "$nama berumur $umur tahun";
}

$timA = [70, 85];
$timB = [90, 95];
echo jumlahkan(...$timA, ...$timB) . "\n";

$dataDiri = ["Budi Santoso", 28];
echo perkenalkan(...$dataDiri) . "\n";

Output yang Dihasilkan:

text
340
Budi Santoso berumur 28 tahun

Pemanggilan jumlahkan(...$timA, ...$timB) mengirim empat argumen (70, 85, 90, 95) sehingga hasilnya 340. Pada baris terakhir, spread juga bekerja untuk fungsi dengan parameter tetap: array ["Budi Santoso", 28] diurai menjadi dua argumen yang mengisi $nama dan $umur secara berurutan. Jika jumlah item array tidak cocok dengan jumlah parameter, PHP memunculkan ArgumentCountError sebagaimana pemanggilan manual.

Variadic dan Named Arguments #

Begitu bertemu parameter variadic, named arguments yang kita pelajari pada Chapter sebelumnya mendapat perilaku tambahan yang menarik. Nama argument yang tidak cocok dengan parameter mana pun akan dikumpulkan ke parameter variadic sebagai pasangan kunci-nilai, bukan ditolak. Kunci menjadi nama argument, dan nilainya adalah nilai yang dikirim.

php
<?php
function buatKonfigurasi(...$opsi): array
{
    return $opsi;
}

print_r(buatKonfigurasi(tema: "gelap", bahasa: "id"));
print_r(buatKonfigurasi("bawaan", debug: true));

Output yang Dihasilkan:

text
Array
(
    [tema] => gelap
    [bahasa] => id
)
Array
(
    [0] => bawaan
    [debug] => 1
)

Pada pemanggilan pertama, $opsi berisi ["tema" => "gelap", "bahasa" => "id"] — array asosiatif siap pakai. Pada pemanggilan kedua, argumen posisi "bawaan" menempati kunci integer 0 sedangkan debug: true masuk dengan kunci string "debug"; perhatikan bahwa nilai true tampil sebagai 1 pada print_r(). Perilaku ini menjadikan variadic functions cocok untuk menerima konfigurasi opsional, meniru cara kerja banyak opsi pada fungsi bawaan PHP.

Pola Format Seperti printf #

Kombinasi variadic dan spread menghasilkan pola yang sangat praktis: fungsi pembungkus dengan format string seperti printf(). Fungsi sprintf($format, ...$nilai) memang sudah variadic secara bawaan, tetapi kita bisa mengirimkannya nilai yang baru dikumpulkan agar hasil formatnya diproses lebih lanjut, misalnya ditambah awalan log.

php
<?php
function logAktivitas(string $format, ...$nilai): string
{
    return "[INFO] " . sprintf($format, ...$nilai);
}

echo logAktivitas("Pengguna %s membuat %d pesanan", "Budi", 3) . "\n";
echo logAktivitas("Server %s memakai PHP %s", "web-01", "8.4") . "\n";

Output yang Dihasilkan:

text
[INFO] Pengguna Budi membuat 3 pesanan
[INFO] Server web-01 memakai PHP 8.4

Parameter $format menampung templat berisi penanda %s (string) dan %d (integer), sedangkan $nilai mengumpulkan sisa argumen. Di dalam tubuh fungsi, sprintf($format, ...$nilai) membalik prosesnya: array $nilai dibongkar kembali menjadi argumen untuk sprintf(). Dengan begitu pemanggil cukup menulis satu baris dan seluruh nilai sisipan tetap tersalur.

func_get_args, Cara Lama #

Sebelum PHP 5.6 memperkenalkan sintaks ..., fungsi dengan argumen bebas ditulis tanpa parameter sama sekali lalu membaca argumen lewat func_get_args(). Anda masih akan menemukan pola ini di kode lama, jadi kita perlu mengenalinya.

php
<?php
function jumlahkanLama()
{
    return array_sum(func_get_args());
}

echo jumlahkanLama(1, 2, 3, 4) . "\n";

Output yang Dihasilkan:

text
10

Fungsi func_get_args() mengembalikan array berisi seluruh argumen pemanggilan saat itu, sehingga array_sum() menghasilkan 10. Cara ini berfungsi, tetapi memiliki kelemahan: tipe argumen tidak bisa dinyatakan, named arguments tidak terlihat oleh func_get_args(), dan deklarasi fungsi tidak menunjukkan apa pun tentang argumen yang diterima. Untuk kode baru, selalu gunakan parameter variadic ....

Ringkasan #

Parameter variadic ...$nama mengumpulkan argumen sisa menjadi array dan harus ditempatkan paling belakang; tipe seperti int ...$angka berlaku untuk setiap item yang masuk. Di sisi pemanggilan, spread f(...$array) melakukan sebaliknya dengan membongkar array menjadi argumen, dan named arguments yang tidak dikenal terkumpul sebagai pasangan kunci-nilai. Dengan bekal ini, kita siap membahas bagaimana fungsi mengembalikan hasil olahannya ke pemanggil melalui nilai kembalian pada Chapter berikutnya.

Referensi #