web-dev-qa-db-ja.com

if( 'constant' == $ variable)とif($ variable == 'constant')

最近、PHPで、特にWordPressフレームワーク内で、多くのコードに気づいています。

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

私が見ると予想していた場所:

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

これは特定の言語/フレームワークで見られる慣習ですか?前者のアプローチが後者よりも好ましい理由はありますか(処理の観点から、または解析の観点から、さらには人間の観点から?)

それとも単に好みの問題ですか?私は常に、テストを実行するときに、定数に対してテストされる変数項目が左側にある方が良いと考えてきました。 「チョコレートがケーキの場合」よりも、「ケーキがチョコレートの場合」のように、自然言語で質問する場合の方がより適切にマッピングされているようです。

50
Tom Auger

これを行う主な理由(いわゆる「ヨーダ条件付き」)は、偶然に等価比較演算子(=)の代わりに代入演算子(==)を使用するという事故を防ぐためです。

つまり、次のように間違えた場合:

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

ステートメントはtrue(または、PHPのような一部の言語の場合は真の値)と評価され、見つけにくいバグが発生します。

しかし、あなたがした場合:

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

$fooを整数に割り当てることができないため、致命的なエラーが発生します。

ただし、指摘したように、順序を逆にすると、一般的に読みにくくなります。したがって、多くのコーディング標準(ただし、すべてではない WordPressを含む )は、$foo == 1のバグハンティングの利点にもかかわらず、1 == $fooを提案または要求します。

一般に、私のアドバイスは、確立されたコーディング標準があればそれに従うことです。WordPressの場合、ヨーダの条件文を使用することを意味します。

存在せず、同僚との合意によって確立することが不可能である場合、それはディーラーの選択です。

84
user8

これは、割り当て演算子が誤って使用されるのを防ぐための防御的なコーディングメカニズムです。

等価演算子の代わりに代入演算子の誤用/エラーを検討してください

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

上記の条件は常にtrueを返しますが、それはおそらく元のプログラマが考えていたものではありません。その場所で、これを検討してください

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

ここでは、PHP(および他のほとんどの言語))はanythingを固定に割り当てることができないため、実行を拒否します1の値すべての条件ステートメントをこのようにコーディングすることにより、条件内での代入演算子の誤った使用を自動的に防止します。

13
Alan Storm

私はJavaでその規則を使用して、nullポインタ例外の可能性を排除します。したがって、このようなものは問題を引き起こしたり、追加のコードを必要としたりしません。

String foo = null;

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

実際には、多くのコンパイラは「if(x == 1)」の代わりに「if(x = 1)」と書いた場合に警告を出します。

Clangを使用すると、コンパイラに「つまり、私がやっていることを知っている」と効果的に伝えることで警告を回避できます。これは、「if((x = 1))」と書くことで行われます。余分な括弧に注意してください。これは他の状況でも機能します。 if(false)ステートメント。ステートメントが実行されないという警告が表示される場合があります。 if((false))ステートメント;その警告を与えません。

0
gnasher729