Operator Walrus di PHP

Pada bulan Oktober 2019, Python 3.8 memperkenalkan operator Walrus (:=) melalui PEP 572 – dan dengan demikian memicu salah satu kontroversi terbesar dalam sejarah bahasa pemrograman. Perdebatan itu begitu sengit sehingga penemu Python Guido van Rossum pada bulan Juli 2018 – bahkan sebelum rilis – posisinya sebagai BDFL (Diktator Baik Hati Seumur Hidup). Sejak awal tahun 2019, Python telah diatur oleh Dewan Pengarah yang dipilih.


if (n := len(items)) > 10:
    print(f"List is too long ({n} elements)")

Perpecahan tata kelola muncul segera setelah diskusi Walrus—kasus langka di mana satu fitur bahasa memiliki konsekuensi struktural. Dalam pernyataannya, van Rossum menjelaskan: "Puncaknya adalah Proposal Peningkatan Python yang sangat kontroversial. Setelah saya menerimanya, orang-orang menggunakan media sosial seperti Twitter dan mengatakan hal-hal yang menyakiti saya secara pribadi."

Ia melanjutkan: "Sekarang setelah PEP 572 selesai, saya tidak ingin lagi harus berjuang keras untuk sebuah PEP dan mendapati begitu banyak orang membenci keputusan saya. Saya ingin sepenuhnya melepaskan diri dari proses pengambilan keputusan." Kritik tersebut tidak hanya datang dari komunitas yang lebih luas, tetapi juga dari para pengembang inti.

Mereka berpendapat bahwa operator tersebut bertentangan dengan prinsip-prinsip dasar Python dari Zen Python —terutama preferensi untuk kesederhanaan daripada kompleksitas. Setelah hampir tiga dekade menjadi perancang bahasa yang tak terbantahkan, hal ini menandai berakhirnya sebuah era. Namun, sementara Python harus memperkenalkan operator Walrus baru, yang memecah belah komunitasnya, muncul pertanyaan: Bagaimana bahasa lain menangani konsep serupa?

Operator Python := (Ekspresi Penugasan alias "Walrus") tidak ada di PHP – karena tidak diperlukan. Dalam PHP, operator penugasan = selalu Pernyataan dan ekspresi pada saat yang sama: Penugasan mengembalikan nilai yang ditugaskan. Inilah mengapa pola idiomatik seperti “assign-and-test” bekerja di if-kondisi tanpa fitur bahasanya sendiri.

function get_some_field() {
    return 'foo';
}
if ($a = get_some_field()) {
    echo $a; // foo
}
// Hinweis: $a ist *gesetzt*, selbst wenn die Bedingung falsy wäre.

$a = get_some_field() menetapkan dan mengevaluasi ke sisi kanan. Jika ini “kebenaran”, Anda memasukkan if-Blok. Latar Belakang: Dalam Python, := (PEP 572) karena penugasan sederhana bukanlah ekspresi. Dalam PHP, hal ini selalu berbeda, jadi tidak diperlukan persamaan. Dua hal yang sering menyebabkan bug.: = (Penugasan) memiliki prioritas lebih rendah daripada kebanyakan operator relasional; tanda kurung menentukan evaluasi.

Dalam ekspresi yang lebih kompleks, Anda harus selalu menggunakan tanda kurung untuk meningkatkan keterbacaan dan kejelasan. ?? memiliki prioritasnya sendiri, yang agak rendah. Hal ini menjelaskan kejutan dalam ekspresi seperti $x ?? null === null. Tanpa tanda kurung, pertama null === null dievaluasi. Lebih baik untuk selalu memberi tanda kurung secara eksplisit: ($x ?? null) === null. $a juga ada di luar if-Blok – mungkin dengan nilai yang salah.

function get_some_field() {
    return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
    echo $a; // bar
}

Jadi jelaslah bahwa === 'bar' diterapkan pada nilai yang ditetapkan. Tanda kurung penting di sini untuk keterbacaan dan prioritas. Dalam praktiknya, pola ini menghindari panggilan duplikat yang tidak perlu (misalnya, dari pembuat kueri) dengan menyimpan hasil kueri dan kemudian memeriksanya. Dalam aplikasi produktif, seperti proyek berbasis Laravel, pola berikut dapat diamati lebih sering.:

if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
    dd($foo->get());
}

&& bersifat short-circuiting: Bagian kanan hanya dievaluasi jika bagian kiri bernilai true. Dengan menetapkan pernyataan di hulu, Anda menghindari penetapan pernyataan di luar pernyataan if. Apakah ini praktik yang baik bergantung pada kode dan alat analisis tim Anda; secara semantik, ini benar. Setidaknya, Anda harus tahu apa yang dilakukan kode tersebut jika Anda menemukannya di lapangan.

PHP tidak memerlukan "operator Walrus" karena penugasan sudah merupakan ekspresi. Hal ini memungkinkan pola idiomatis seperti "assign-and-test" – yang efisien dan ringkas. Di saat yang sama, tuntutan disiplin meningkat: penggunaan tanda kurung, perbandingan yang ketat, kesadaran akan kebenaran/kesalahan, dan konvensi tim yang jelas menjadi hal yang wajib. Mereka yang mengikuti panduan ini akan mendapatkan manfaat dari ide Walrus tanpa memerlukan fitur bahasa tambahan.

Kembali