Proposal Named Arguments pada PHP 8

1 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Named arguments pada PHP 8
Named arguments pada PHP 8

TeknoCerdas.com – Salam cerdas untuk kita semua. PHP 8 direncanakan akan dirilis pada akhir tahun 2020 lebih tepatnya 26 November 2020. Salah satu proposal yang diajukan adalah proposal named arguments pada PHP 8. Apa yang dimaksud dengan named arguments?

Named arguments atau named parameters adalah sebuah cara mengirimkan argumen pada sebuah fungsi atau method menggunakan sebuah nama pengenal ketimbang susunan urutan argumen.

Masih sedikit bingung? mari ambil contoh fungsi built-in PHP yang memiliki argumen yang cukup banyak yaitu setcookie().

setcookie(
    "teknocerdas",      // ---> 1
    "abc123",           // ---> 2
    time() + 3600,      // ---> 3
    "",                 // ---> 4
    "",                 // ---> 5
    false,              // ---> 6
    true                // ---> 7
);

Jika melihat potongan kode diatas dan tidak melihat dokumentasi dari fungsi setcookie() maka yang membaca kode tersebut akan cukup bingung melihat kegunaan dari argumen yang dikirimkan.

Pembaca akan menerka maksud dari setiap argumen tersebut. Apalagi jika text editor tidak mendukung inline-documentation maka harus membuka manual.

Bandingkan dengan proposal named arguments yang akan disematkan pada PHP 8. Berikut pada fungsi yang sama yaitu setcookie() tapi menggunakan named arguments.

setcookie(
    expires: time() + 3600,
    name: "teknocerdas",
    value: "abc123",
    http_only: true
);

Dapat terlihat bahwa argumen yang dikirimkan sekarang memiliki nama, mirip dengan Javascript object tapi tanpa kurung kurawal. Kode menjadi lebih mudah dibaca karena setiap argumen memiliki nama.

Urutan menjadi tidak berpengaruh karena identifikasi dapat dilakukan berdasarkan nama. Sehingga argumen yang tidak diperlukan tidak perlu diset nilainya.

Pada versi PHP < 8 jika ingin melakukan set nilai argumen ke-7 (http_only) maka nilai argumen sebelumnya juga harus dikirimkan. Hal ini karena argumen dibaca berdasarkan urutan sehingga mau tidak mau argumen ke-1 sampai ke-6 harus dikirim. Hal ini tidak berlaku untuk named arguments.

Keuntungan Named Arguments

Tidak Perlu Menulis Nilai Default

Pengembang tidak perlu menuliskan nilai default dari setiap argumen, hanya nilai yang ingin diubah saja yang perlu ditulis. Hal tersebut seperti yang dicontohkan sebelumnya pada kasus setcookie().

Kode yang Terdokumentasi Mandiri

Secara otomatis dengan adanya pengenal atau identifier ketika argumen dikirimkan pada fungsi atau method akan memperpejas pembacaan kode. Sehingga kode terdokumentasi secara mandiri atau self-documenting.

array_slice($array, $offset, $length, true);
// vs
array_slice($array, $offset, $length, preserve_keys: true);

Dapat terlihat jika tanpa named arguments yang membaca kode kemungkinan pasti bertanya apa maksud dari argumen ke-4 yang bernilai boolean true. Dengan adanya named arguments argumen tersebut menjadi jelas.

Inisialisasi Object

Salah satu hal yang baru dari PHP adalah proposal tentang constructor promotion pada sebuah Object. Digabungkan dengan proposal named parameter proposal tersebut menjadi cocok.

Ketika sebuah properti didefinisikan dengan publik, private, atau protected maka diasumsikan properti tersebut akan dipromosikan ke constructor. Sehingga pada saat objek dibuat properti tersebut dapat diset nilainya.

class TeknoCerdas 
{
  public function __construct(
    public $author = null, public $url = null
  ) {
    // do something here or nothing
  } 
}

Ketika membuat object dari TeknoCerdas dengan named arguments dapat ditulis seperti dibawah.

$teknocerdas = new TeknoCerdas(
    url: "https://teknocerdas.com", 
    author: "Rio Astamal"
);

Untuk keterangan lengkap seputar keuntungan atau detail yang lain dapat merujuk ke halaman resmi proposal named arguments.

Apakah anda pengembang yang biasa menggunakan PHP? Jika ya bersiap-siap untuk menggunakannya dimasa depan agar kode lebih mudah dibaca.