PHP'nin üçlü operatörünü yalnızca iki argümanla kullanma


9

Son zamanlarda bazı kodumu gözden geçiriyordu ve bir eksiklik uyum içinde, aşağıdaki gibi bir yapı bıraktığını fark ettim:

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

Şimdi, bu yapılması gerekeni ve yanlış olanı yapmıyordu , ancak bu özellik her zaman ayarlandığından iyi çalışıyor ve aşağıdaki değişiklik nedeniyle 5.3'ten beri sözdizimi hatası yok :

PHP 5.3'ten bu yana, üçlü operatörün orta kısmını dışarıda bırakmak mümkündür. İfade ifade1?: İfade ifade DOĞRU olarak değerlendirilirse ifade ifade1, aksi takdirde ifade ifade eder.

Bu değişikliğin farkında değildim ve şimdi kullanmam gerekip gerekmediğini merak ediyorum. Bu, yakut gibi dillerden, gerçek bir boole almaktan ziyade a = b || cya bda cyerine almak için yapabileceğim, eksik olduğum bir şey . Bununla birlikte, üçlü operatör için seçtikleri sözdizimi benim için biraz sezgisel görünüyor. Bunu üretim kodunda mı kullanmalıyım? Kazara gördüğümde kesinlikle kendimi fırlattım.


Bunun için null birleştirme operatörü kullanmalısınız Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

Yanıtlar:


7

İkinci argüman olmadan üçlü koşullu operatör biraz roman, ama benzer 1 için boş-kaynaştırma gibi diğer Algol-türev dilde bulunan operatör C # ve Perl ve söz olarak, ||Ruby (ve JavaScript) operatörü.

İlk başta garip görünüyor, ama orada çok fazla değil (özellikle diğer dillerde benzer operatörler için emsal olduğu için) ve çok sayıda tuş vuruşunu kurtarabilir. Ve, ad alanı sınırlayıcısı ( \) ile olan herhangi bir gösterge ise, tuhaf sözdizimleri sonunda PHP topluluğu tarafından benimsenecektir.

Ancak PHP uygulamalarının karşılaştığı en büyük sorunlardan biri, PHP'nin yeni bir sürümünün piyasaya sürülmesi ile ana bilgisayarların bunu desteklemeye başlaması arasındaki (bazen) dayanılmaz uzun gecikme süresidir. Bu, PHP'nin eski sürümleriyle geriye dönük olarak uyumlu olmanız gereken sorunlara yol açar ve bu gibi kolaylık değişikliklerinin kullanılmasını önler.

Bu sizin için bir endişe değilse ve ekibiniz kullanımını kabul ediyorsa (veya yalnız bir geliştiriciyseniz, eğer rahatsanız), elbette bunun için gidin. İsim alanı sınırlayıcısı gibi, gerçekten gelecekteki tüm PHP projelerinde kabul edilebilir olacağı zaman değil, gerçekten ne zaman olacağını düşünüyorum.


Not 1 : Aynı değil, verilen null birleştirme operatörleri yalnızca null olmayan değerleri test eder (ve PHP gibi doğru değerleri değil) ve ?:sözdizimi yorumlarda belirttiğiniz gibi tanımlanmamış bildirimleri bastırmaz .


Şu anda 'ekibim' tamamen benden oluşuyor. Barındırma bir sorun değildir, çünkü genellikle inşa ettiğimiz sitelerin% 98'ini barındırırız ve 5.3.6'nın üstünde barındırırız. İşlevselliğin kendisinin o kadar sıra dışı olmadığını, sadece sorumun kökü olan sözdiziminin farkındayım. Ayrıca, daha fazla sözdizimi olmadan null birleştirme operatörü gibi davranmadığı bir sorun da var ( @tanımlanmamış şeyler hakkındaki bildirimleri gizlemek için).
Matthew Scharley

3
@MatthewScharley Ad alanı sınırlayıcısı (\) çöküşü herhangi bir gösterge ise, garip sözdizimi PHP'de yaygın olarak benimsenmesinin önünde bir engel değildir. Gerçekten, ne zaman kullanmaya başlayacağınız zaman değil.

3

Bana göre, bu kodda bir hata gibi görünüyor. Yanlış görünüyor ve genel olarak, birkaç tuş vuruşunu kaydetmek için bir hata yaptığınıza benzeyen sözdizimini kullanmaktan kaçınıyorum. Siz (veya bir başkası) daha sonra kodu okumak için geri döndüğünde, bu hattın sizi harekete geçireceğini ve aslında basit bir işlem için yaptığı işi ayrıştırmak için zaman harcamanıza neden olacağını düşünüyorum.


Verilen örnek yanlış . İşlevselliğin amaçlandığı gibi doğru kullanımı, buna $foo = @$bar ?: 'baz'eşdeğerdir $foo = (@$bar ? $bar : 'baz'). Yine de yorumlarınıza katılıyorum.
Matthew Scharley

1

Eh, PHP bir boolean türü vardır ve ||operatör arasında PHP'de yüzden, sonuç bir Boolen döndüren $a || $bbu tutarlı bir boolean &&gibi &&birini veya diğerini dönmek için çok az mantıklı ama dönüş mantıklı true/ false. Tüm boolean operatörlerinin bools döndürmesi de oldukça mantıklı.

Ek olarak bu PHP'den bir buluş değildir ancak "klasik" PHP'nin birçok tasarım öğesinin geldiği C'yi takip eder. C99 standardının §6.5.14'ünden alıntı:

|| operatör, işlenenlerinden herhangi biri 0 ile eşit değilse 1 verir; aksi takdirde 0 verir. Sonuç int türündedir.

Ve, ne kullanmanız gerekir?: Ya da genel formda cevaplanamaz, ama akıl: Dilin en iyi yolu, sağladığı yapıları kullanmak ve önerdiği paradigmaları kullanmaktır. C kodu gibi Java kodu yazmanın veya başka bir şekilde ;-)


0

Bence çok kullanışlı bir operatör ve dil standardı açıkça tanımladığı için kesinlikle kullanılmalı.

Resmi olarak Grooy'daki Elvis Operatörü olarak adlandırılır (neden? Sadece yakından bakın!) Ve Java 7'de sunulması önerildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.