Pada Oktober 2019, Python 3.8 memperkenalkan pengendali Walrus (:=) melalui PEP 572 – dan dengan itu mencetuskan salah satu kontroversi terbesar dalam sejarah bahasa pengaturcaraan. Perdebatan itu sangat pahit sehingga pencipta Python Guido van Rossum pada Julai 2018 - walaupun sebelum pembebasan - kedudukannya sebagai BDFL (Diktator Baik Seumur Hidup). Sejak awal tahun 2019, Python sebaliknya telah ditadbir oleh Majlis Pemandu yang dipilih.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Keretakan tadbir urus timbul serta-merta selepas perbincangan Walrus—kes yang jarang berlaku di mana satu ciri bahasa mempunyai akibat struktur. Dalam kenyataannya, van Rossum menjelaskan: "Jerami terakhir adalah Cadangan Peningkatan Python yang sangat kontroversi. Selepas saya menerimanya, orang ramai menggunakan media sosial seperti Twitter dan mengatakan perkara yang menyakitkan saya secara peribadi."
Dia menyambung: "Sekarang PEP 572 sudah tamat, saya tidak mahu perlu berjuang begitu keras untuk PEP lagi dan mendapati ramai orang membenci keputusan saya. Saya mahu membuang diri saya sepenuhnya daripada proses membuat keputusan." Kritikan datang bukan sahaja daripada komuniti yang lebih luas, tetapi juga daripada pembangun teras.
Mereka berhujah bahawa pengendali itu bercanggah dengan prinsip Python asas daripada Zen of Python — terutamanya keutamaan untuk kesederhanaan berbanding kerumitan. Selepas hampir tiga dekad sebagai pereka bahasa yang tidak dipertikaikan, ini menandakan berakhirnya era. Tetapi sementara Python terpaksa memperkenalkan pengendali Walrus baharu, membahagikan komunitinya dalam proses itu, persoalan timbul: Bagaimanakah bahasa lain mengendalikan konsep yang serupa?
Pengendali Python := (Ungkapan Tugasan alias "Walrus") tidak wujud dalam PHP – kerana ia tidak diperlukan. Dalam PHP, pengendali tugasan = sentiasa Kenyataan dan ungkapan pada masa yang sama: Tugasan mengembalikan nilai yang diberikan. Inilah sebabnya mengapa corak idiomatik seperti "tugaskan-dan-ujian" berfungsi if-keadaan tanpa ciri bahasa mereka 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() memberikan dan menilai ke sebelah kanan. Jika ini "benar", anda masukkan if-Sekat. Latar Belakang: Dalam Python, := (PEP 572) kerana tugasan mudah bukan ungkapan. Dalam PHP, ini sentiasa berbeza, jadi tidak ada keperluan yang setara. Dua perkara sering membawa kepada pepijat.: = (Tugasan) mempunyai keutamaan yang lebih rendah daripada kebanyakan pengendali perhubungan; kurungan menentukan penilaian.
Dalam ungkapan yang lebih kompleks, anda harus sentiasa menggunakan kurungan untuk meningkatkan kebolehbacaan dan kejelasan. ?? mempunyai keutamaan tersendiri yang agak rendah. Ini menerangkan kejutan dalam ungkapan seperti $x ?? null === null. Tanpa kurungan, pertama null === null dinilai. Adalah lebih baik untuk sentiasa kurungan secara eksplisit: ($x ?? null) === null. $a juga wujud di luar if-Blok – mungkin dengan nilai palsu.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Jadi jelas bahawa === 'bar' digunakan pada nilai yang ditetapkan. Tanda kurung penting di sini untuk kebolehbacaan dan keutamaan. Dalam amalan, corak ini mengelakkan panggilan pendua yang tidak perlu (cth., pembina pertanyaan) dengan menyimpan hasil pertanyaan dan kemudian menyemaknya. Dalam aplikasi yang produktif, seperti projek berasaskan Laravel, corak berikut boleh diperhatikan dengan lebih kerap.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& adalah litar pintas: Bahagian kanan hanya dinilai jika bahagian kiri adalah benar. Dengan memberikan pernyataan di hulu, anda mengelak daripada memberikan pernyataan di luar pernyataan if. Sama ada ini amalan yang baik bergantung pada kod dan alatan analisis pasukan anda; secara semantik, memang betul. Sekurang-kurangnya, anda harus tahu apa yang dilakukan oleh kod itu jika anda menemuinya di alam liar.
PHP tidak memerlukan "operator Walrus" kerana tugasan sudah menjadi ungkapan. Ini menjadikan corak idiomatik seperti "tugaskan-dan-ujian" mungkin - berprestasi dan ringkas. Pada masa yang sama, tuntutan terhadap peningkatan disiplin: kurungan, perbandingan ketat, kesedaran tentang kebenaran/palsu, dan konvensyen pasukan yang jelas adalah wajib. Mereka yang mengikuti garis panduan ini mendapat manfaat daripada idea Walrus tanpa memerlukan ciri bahasa tambahan.