Menggunakan operator ternary PHP hanya dengan dua argumen

9

Saya baru-baru ini meninjau beberapa kode saya dan memperhatikan bahwa karena ketidakhadiran, saya meninggalkan struktur seperti berikut:

$guid = empty($subscription->guid) ?  : $subscription->guid;

Sekarang, ini tidak melakukan apa yang seharusnya dan salah , tetapi karena properti itu selalu disetel sekarang berfungsi dengan baik, dan tidak ada kesalahan sintaks sejak 5.3 karena perubahan berikut :

Sejak PHP 5.3, dimungkinkan untuk meninggalkan bagian tengah dari operator ternary. Ekspresi expr1?: Expr3 mengembalikan expr1 jika expr1 mengevaluasi ke TRUE, dan expr3 sebaliknya.

Saya tidak menyadari perubahan ini, dan sekarang saya ingin tahu apakah saya harus menggunakannya atau tidak. Ini adalah sesuatu yang sangat saya lewatkan dari bahasa-bahasa seperti ruby ​​di mana Anda dapat melakukan mis, a = b || cuntuk mendapatkan salah satu batau clebih daripada boolean 'nyata'. Namun, sintaks yang mereka pilih untuk operator ternary tampaknya sedikit berlawanan dengan intuisi bagi saya. Haruskah saya menggunakan ini dalam kode produksi? Itu benar-benar membuat diriku terlempar ketika aku melihatnya secara tidak sengaja.

Matthew Scharley
sumber
Anda harus menggunakan operator penggabungan nol untuk itu Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

Jawaban:

7

Operator kondisional terner tanpa argumen kedua adalah sebuah novel bit, tetapi mirip 1 dengan nol-penggabungan operator yang ditemukan dalam bahasa Algol-derivatif lainnya seperti C # dan Perl, dan seperti yang Anda sebutkan, yang ||operator dalam Ruby (dan JavaScript).

Ini terlihat aneh pada awalnya, tetapi tidak terlalu di luar sana (terutama karena ada preseden untuk operator serupa dalam bahasa lain), dan dapat menghemat banyak penekanan tombol. Dan, jika apa yang terjadi dengan pembatas namespace ( \) adalah indikasi, sintaks aneh akhirnya akan diadopsi oleh komunitas PHP.

Tetapi salah satu masalah utama yang cenderung dihadapi aplikasi PHP adalah waktu jeda yang sangat lama antara rilis versi baru PHP dan ketika host mulai mendukungnya. Ini mengarah ke masalah di mana Anda harus kompatibel dengan versi PHP yang lebih lama, menghentikan penggunaan perubahan kenyamanan seperti ini.

Jika itu bukan masalah bagi Anda, dan tim Anda menyetujui penggunaannya (atau jika Anda adalah pengembang solo, jika Anda merasa nyaman dengan itu), tentu saja lakukanlah. Seperti pembatas namespace, saya benar-benar berpikir itu akan menjadi masalah kapan, bukan jika, itu akan diterima di semua proyek PHP di masa depan.


Catatan 1 : Tetapi tidak identik, operator null-coalescing hanya menguji pada nilai-nilai non-null (dan bukan nilai-nilai kebenaran seperti PHP), dan ?:sintaksisnya tidak menekan pemberitahuan yang tidak ditentukan seperti yang Anda sebutkan di komentar .

Komunitas
sumber
Saat ini, 'tim' saya murni terdiri dari saya. Hosting bukan masalah karena kami biasanya meng-host 98% dari situs yang kami bangun, dan kami meng-host di atas 5.3.6. Saya menyadari fungsionalitas itu sendiri tidak begitu biasa, hanya sintaks untuk itu yang merupakan akar dari pertanyaan saya. Ada juga masalah di mana ia tidak bertindak seperti operator penggabungan nol tanpa lebih banyak sintaks ( @untuk menyembunyikan pemberitahuan tentang hal-hal yang tidak ditentukan).
Matthew Scharley
3
@ MatthewScharley Jika bencana namespace delimiter (\) adalah indikasi, sintaks aneh bukan penghalang untuk adopsi luas di PHP. Ini benar-benar turun ke kapan, bukan jika, Anda harus mulai menggunakannya.
3

Bagi saya, itu terlihat seperti kesalahan dalam kode. Tampaknya salah, dan secara umum, saya menghindari menggunakan sintaksis yang sepertinya Anda telah membuat kesalahan demi menyelamatkan beberapa penekanan tombol. Ketika Anda (atau orang lain) kembali membaca kode nanti, saya pikir kalimat itu akan membuat Anda tersandung dan menyebabkan Anda harus menghabiskan waktu untuk menguraikan apa yang dilakukannya, untuk apa yang pada dasarnya merupakan operasi sederhana.

MattBelanger
sumber
Contoh yang diberikan salah . Penggunaan fungsionalitas yang benar sebagaimana dimaksud akan $foo = @$bar ?: 'baz'setara dengan $foo = (@$bar ? $bar : 'baz'). Saya setuju dengan komentar Anda.
Matthew Scharley
1

Ya, PHP memiliki tipe boolean dan ||operator mengembalikan boolen, jadi dalam PHP hasilnya $a || $badalah boolean, ini konsisten dengan &&karena &&tidak masuk akal untuk mengembalikan satu atau yang lain tetapi masuk akal untuk mengembalikan true/ false. Memiliki semua operator boolean mengembalikan bool juga terdengar logis.

Selain itu ini bukan penemuan dari PHP tetapi mengikuti C, di mana banyak elemen desain "klasik" PHP berasal. Mengutip dari §6.5.14 dari standar C99:

The || operator harus menghasilkan 1 jika salah satu operannya membandingkan tidak sama dengan 0; jika tidak, ini menghasilkan 0. Hasilnya bertipe int.

Dan, baik, apa yang harus Anda gunakan?: Atau tidak tidak dapat dijawab dalam bentuk umum, tetapi pikiran: Cara terbaik untuk bahasa adalah dengan menggunakan konstruksi yang disediakan dan menggunakan paradigma yang disarankan. Ada sedikit akal dalam menulis kode Java seperti kode C, atau sebaliknya ;-)

johannes
sumber
0

Saya pikir ini adalah operator yang sangat berguna dan harus digunakan karena standar bahasa secara eksplisit mendefinisikannya.

Perhatikan bahwa secara resmi disebut Elvis Operator di Grooy (mengapa? Lihat saja dari dekat!), Dan telah diusulkan untuk diperkenalkan di Jawa 7.

Michael Borgwardt
sumber