0

PHP がどのように条件付きステートメントを処理するか、ネストを使用した操作の順序に興味があります。次の条件を使用する場合if

if(x == (1 || 2))
{
    // do something
}

私はそれが同じように振る舞うことを期待します

if(x == 1 || x == 2)
{
    // do something
}

...しかし、そうではありません。私の最初の例は、非常に理にかなった便利な省略表現のように思えますが、期待どおりの結果にはなりません。誰でもこの問題に光を当てることができますか? PHP は最初のステートメントで正確に何をしますか?

4

8 に答える 8

2

あなたの速記は論理的に無効です。ほとんどすべての場合、テストしたいすべての可能性について完全な論理ケースを書き出す必要があります。

PHPでは、次のようなばかげたことができるので、「ほぼ」と言います。

if( in_array($x, array(1,2)) ) {
  // code!
}
于 2013-02-21T17:30:02.367 に答える
2

したがって、このコードの場合:

if ($x == ( 1 || 2)) 
{
    // do something
}

PHP では、ゼロ以外の数値はすべて true と見なされます。免責事項: この事実は、他の言語では必ずしも真実ではありません。したがって、PHP では、false と見なされる数値は 0 だけです。したがって$x == true、上記のコードでかどうかを尋ねています。

したがって、$xが 0 以外の任意の数であるときはいつでも、 内のステートメントはifとして解決されtrueます。ただし、それはもちろんどちらが として解決される$x = 0かを言うのと同じです。false == truefalse

この記事が役立つかもしれません: PHP: Booleans

于 2013-02-21T17:43:52.907 に答える
1
x == (1 || 2) 

evaluates like this:

(1 (if its false) then testing for 2, if not, the expression returns true)

now it will become:

if(x==true)?

( PHP.NET )から取得した別の例:

// foo() は、これらの演算子が短絡しているため呼び出されません

$b = (true  || foo()); 
于 2013-02-21T17:19:49.803 に答える
1

演算子の優先順位については、こちらを参照してください http://php.net/manual/en/language.operators.precedence.php

于 2013-02-21T17:19:53.777 に答える
1

これは数学 (BEDMAS と考えてください) と同じように動作し、括弧が最初に実行されます。したがって、あなたの例は次のように動作しています:

if (x == ( 1 || 2)) {
  //code
}

1 と 2 はどちらもゼロ以外の値であるため (両方とも真)、次のようになります。

if (x == true) {
  //code
}

残念ながら、あなたが必要とするものを手に入れるには:

if (x == 1 || x == 2) {
  //code
}
于 2013-02-21T17:19:56.307 に答える
0

最初に if の結果を評価1||2し、それが x に等しいことを確認します

秒でそのようなthis or this or this

var_dump(1 || 2)ただし、最初はtrue になるたびに返されることがわかります。

 $x = 3;
 var_dump($x == 1 || 2);
 if($x == 1 || 2){
     echo 'inside if';
  }

であるため、inside if$x が 3 でも出力されます

だから私は2番目の方法は道のりです

于 2013-02-21T17:20:06.260 に答える
0

それはどのように理にかなっていますか?次の論理式を実行するようにコンピューターに要求しています。

if x == (1 || 2)これはx == (1 || 2の結果) と同じです

したがって、式は1 ||からx == trueになります。2は true を返します

コンピューターはあなたが指示したことを何でも実行します

于 2013-02-21T17:20:32.860 に答える
0
if(x == (1 || 2))
{
    // do something
}

ORそして、AND操作が戻ってくるTRUEFALSE 、ステートメントが言う-xが等しい場合(true)-1 or 2常にtrueになるため-これは意味がありません...

于 2013-02-21T17:21:24.037 に答える