it-swarm-tr.com

if ('sabit' == $ değişken) ile if ($ değişken == 'sabit')

Son zamanlarda, PHP ve özellikle WordPress çerçevesinde) çok çalışıyorum.

if ( 1 == $options['postlink'] )

Nerede görmeyi umuyordum:

if ( $options['postlink'] == 1 )

Bu belirli dillerde/çerçevelerde bulunan bir sözleşme mi? Eski yaklaşımın ikincisine tercih edilmesinin bir nedeni var mı (işleme perspektifinden, ayrıştırma perspektifinden, hatta insan perspektifinden)?

Yoksa sadece bir tat meselesi mi? Bir test yaparken her zaman daha iyi olduğunu düşündüm, bazı sabitlere karşı test edilen değişken öğe solda. Soruyu doğal dilde sorabileceğimiz şekilde daha iyi bir şekilde eşleştiriyor gibi görünüyor: "kek kek ise" yerine "kek çikolata ise".

50
Tom Auger

Bunu yapmanın ana nedeni ("Yoda koşullu" olarak adlandırılır), eşit karşılaştırma operatörü (=) Yerine yanlışlıkla bir atama operatörü (==) Kullandığınız kazaları önlemektir.

Yani, yapma hatasını yaptıysanız:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

İfade true (ya da PHP gibi bazı diller söz konusu olduğunda gerçek bir değer) olarak değerlendirilir ve bulunması zor bir hatanız olur.

Ama eğer yaptıysanız:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

Bir tam sayıya $foo Atayamayacağınız için önemli bir hata alırsınız.

Ancak belirttiğiniz gibi, düzeni tersine çevirmek genellikle işleri daha az okunabilir hale getirir. Bu nedenle, birçok kodlama standardı (ancak hepsi değil, WordPress dahil ), $foo == 1 Hata avlama yararlarına rağmen 1 == $foo Öneriyor veya gerektiriyor.

Genel olarak tavsiyem, varsa kodlama standardı varsa, WordPress için Yoda koşullarını kullanmak anlamına gelir.

Olmadığı zaman ve akranlarınızla fikir birliği ile bir tane kurmak imkansız olduğunda, satıcının seçimi.

84
user8

Atama operatörünün yanlışlıkla kullanılmasını önlemek amacıyla yapılan savunma amaçlı bir kodlama mekanizmasıdır.

Eşitlik operatörü yerine atama operatörünün yanlış kullanımını/hatasını düşünün

if ( $options['postlink'] = 1  )

Yukarıdaki koşul her zaman doğru olacaktır, ancak muhtemelen orijinal programcının aklında olan şey bu değildir. Düşünün, yerinde, bunu

if( 1 = $options['postlink'])

Burada, PHP (ve diğer birçok dil) = 1 sabit değerine bir şey atamak imkansız olduğu için çalışmayı reddeder. . Tüm koşullu ifadeleri bu şekilde kodlayarak, bir atama operatörünün bir koşulda yanlışlıkla kullanılmamasını otomatik olarak sağlarsınız.

13
Alan Storm

Ben boş bir işaretçi istisna olasılığını kaldırmak için Java) bu kural kullanmayı seviyorum.Bu yüzden böyle bir şey size herhangi bir sorun neden olmaz veya herhangi bir ekstra kod gerekmez:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}
9
Ben Newman

Uygulamada, birçok derleyici büyük olasılıkla bir hata olduğu için "if (x == 1)" yerine "if (x = 1)" yazarsanız size bir uyarı verecektir.

Clang ile derleyiciye etkin bir şekilde "demek istediğim ve ne yaptığımı biliyorum" diyerek uyarıyı önleyebilirsiniz ve bu "if ((x = 1))" yazarak yapılır. Ekstra parantezlere dikkat edin. Bu diğer durumlarda da işe yarar. if (false) ifadesi; ifadenin asla yürütülmediğine dair bir uyarı verebilir; if ((false)) ifadesi; bu uyarıyı vermez.

0
gnasher729