2017-01-23 161 views
4

使用PHP 7.1.0我跑這個小測試:PHP XOR返回錯誤值

<?php 

$a = true; 
$b = true; 

$value = $a xor $b; 
if ($value == true) { 
    print "bad!\n"; 
} else { 
    print "good\n"; 
}  

,它要回來,說壞。爲什麼?兩個真值的異或應該是FALSE,而不是真的。

回答

7

問題是運算符優先級。該xor操作符比=優先級高,所以你的語句相當於:

($value = $a) xor $b; 

你需要寫:

$value = ($a xor $b); 

$value = $a^$b; 

^操作是按位XOR,不是布爾值。但是truefalse將被轉換爲10,並且按位結果將等同於布爾結果。但是,如果變量的原始值可能是數字,那麼這將不起作用 - 所有非零數字都是真的,但是當您對它們執行按位XOR時,您將得到任何兩個不同數字的真實結果。

PHP Operator Precedence Table

請參閱相關Assignment in PHP with bool expression: strange behaviour

+1

嗯,這只是愚蠢:)謝謝。 – Gargoyle

+0

正確和快速。 +1 –

+1

@Gargoyle這大概是爲了和'and'和'or'一致而完成的。區別在於它們也有'&&'和'||'變體,它們具有更高的優先級,但沒有'xor'的高優先級變體。 – Barmar