2017-01-23 163 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