2015-01-11 6 views
5

私はORをPHPの論理ORとして使用して驚くべき結果を得ています。
は、次のコードを考慮:PHPまたは驚くべき振る舞い

$a = false; 
$b = false; 
$c = true; 

# Test 1, using OR and assigning to a variable 
$value = $a OR $b OR $c; 
var_dump($value); 
# return bool(false) but why? 

# Test 2, using OR directly in var_dump 
var_dump($a OR $b OR $c); 
# return bool(true) as expected 

# Test 3, using || and assigning to a variable 
$value = $a || $b || $c; 
var_dump($value); 
# return bool(true) as expected 

# Test 4, using || directly in var_dump 
var_dump($a || $b || $c); 
# return bool(true) as expected 

をなぜテスト1とテスト2は、それらが同じ論理演算を行うにもかかわらず、異なる結果を与えますか?

答えて

4

||演算子とOR演算子は同じ動作をしません。それらは交換可能に使用することはできません。

||の動作が必要な場合は、それを使用します。 ||が間違ったことをしない限り、ORを使用しないでください。

あなたの状況については、次の2行のコードはまったく同じように動作する。つまり

$value = $a OR $b OR $c; 
($value = $a) OR $b OR $c; 

を、あなたのコードは、基本的には次のとおりです。

$value = $a; 

あなたが||演算子を使用した場合、これらの2つは、このようなブレースがあるかのように同じです:

$value = $a || $b || $c; 
$value = ($a || $b || $c); 

詳細は:あなたは、テスト2でのvar_dumpを実行するときのvar_dumpは、括弧内の操作をラップしているため

$value = ($a OR $b OR $c); 

は、あなたが期待される結果が得られます。http://php.net/manual/en/language.operators.precedence.php

+0

完全に、私は 'OR'と' || 'この回答同じこと –

+1

ですが、リンクを必要とする世界に生きることを嫌います/language.operators.precedence.php – sectus

+0

@sectusありがとうございます。完了しました。 –

0

あなたはそれが期待どおりに動作しますが、括弧内にテスト1をラップした場合。

通常、このようなかっこ内で操作をラップすることは、特に変数割り当てで行うことをお勧めします。

また、 "OR"キーワードと "||"同じように行動しないでください。ここではドキュメントを参照してください:http://php.net/manual/en: http://php.net/manual/en/language.operators.logical.php

+0

もちろん、彼らはしません! –