6

Using php 7.1.0 I'm running this little test:

<?php

$a = true;
$b = true;

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

and it's coming back and saying bad. Why? An xor of two true values should be FALSE, not true.

1 Answer 1

11

The problem is operator precedence. The xor operator has lower precedence than =, so your statement is equivalent to:

($value = $a) xor $b;

You need to write:

$value = ($a xor $b);

or

$value = $a ^ $b;

The ^ operator is bit-wise XOR, not boolean. But true and false will be converted to 1 and 0, and the bit-wise results will be equivalent to the boolean results. But this won't work if the original values of the variables could be numbers -- all non-zero numbers are truthy, but when you perform bit-wise XOR with them you'll get a truthy result for any two numbers that are different.

See the PHP Operator Precedence Table

See the related Assignment in PHP with bool expression: strange behaviour

Sign up to request clarification or add additional context in comments.

4 Comments

@Gargoyle It was presumably done for consistency with and and or. The difference is that there are also && and || variants of them, which have higher precedence, but there's no high-precedence variant of xor.
@PaulCrovella ^ is binary XOR, not boolean.
And XOR can't do short-circuiting. That's the other difference between the boolean and binary operators, but irrelevant for XOR.
If it is guaranteed that $a and $b are both Boolean values, $value = $a != $b would also work (or even $value = $a !== $b).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.