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 || c
untuk mendapatkan salah satu b
atau c
lebih 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.
sumber
Jawaban:
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 .sumber
@
untuk menyembunyikan pemberitahuan tentang hal-hal yang tidak ditentukan).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.
sumber
$foo = @$bar ?: 'baz'
setara dengan$foo = (@$bar ? $bar : 'baz')
. Saya setuju dengan komentar Anda.Ya, PHP memiliki tipe boolean dan
||
operator mengembalikan boolen, jadi dalam PHP hasilnya$a || $b
adalah boolean, ini konsisten dengan&&
karena&&
tidak masuk akal untuk mengembalikan satu atau yang lain tetapi masuk akal untuk mengembalikantrue
/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:
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 ;-)
sumber
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.
sumber