Используя php 7.1.0 я запускаю этот маленький тест:
<?php
$a = true;
$b = true;
$value = $a xor $b;
if ($value == true) {
print "bad!\n";
} else {
print "good\n";
}
и он возвращается и говорит плохо. Зачем? Xor двух истинных значений должен быть ЛОЖНЫМ, а не истинным.
Проблема в приоритете операторов. xor
оператор имеет более низкий приоритет, чем =
так что ваше утверждение эквивалентно:
($value = $a) xor $b;
Вам нужно написать:
$value = ($a xor $b);
или же
$value = $a ^ $b;
^
оператор является побитовым XOR, а не логическим. Но true
а также false
будет преобразован в 1
а также 0
и побитовые результаты будут эквивалентны логическим результатам. Но это не сработает, если исходные значения переменных могут быть числами — все ненулевые числа являются правдивыми, но когда вы выполняете битовое XOR с ними, вы получите достоверный результат для любых двух чисел, которые отличаются ,
Увидеть Таблица приоритетов операторов PHP
Смотрите связанные Назначение в PHP с выражением bool: странное поведение
Других решений пока нет …