Почему $ x истинно в этом статусе?
$x = true and false;
У меня проблема с некоторыми переменными, но я мог бы уменьшить проблему до примитивных логических значений.
Обновление. Как вы видите в ответах, эффект имеет отношение к приоритету оператора в PHP. Также есть хорошее объяснение проблемы в этом вопросе , которую я не мог найти в сети до того, как не знал, что у меня есть проблема с этим, и я не знал, что существует разница между '&& '/' ||» и 'и' / 'или'.
После некоторого поиска я узнал, что это вызвано приоритетом оператора в PHP. Оператор '=' сильнее, чем 'и'.
Если вы хотите получить ожидаемый результат, вам нужно использовать фигурные скобки:
$x = (true and false); //correct: $x is false now!
Без фигурных скобок выражение равно ($x = true) and false;
, $ x получит «истинное» значение. После этого интерпретатор PHP «заменяет» это присваивание значением, которое только что получил x. Так true and false;
остается. И это ничего не делает. «ложь» теряется и не влияет на выражение.
Имейте в виду, что фигурные скобки НЕ требуются, если вы используете «&&» или «||»! Они сильнее, чем «=» и, следовательно, сильнее, чем «и» и «или». Странный…
Это отличается от, например, $x = 5 + 6;
так как здесь «+» сильнее, чем «=», он будет разрешен первым. В конце он затрагивает только логические операторы 'и', 'или' и 'xor'. Только с ними нужно следить.
Также обратите внимание, что это отличается от других языков, таких как JavaScript или Java. На этих языках вам не нужны скобки, поскольку логические операторы сильнее, чем оператор равенства ( операторы в JavaScript , операторы в Java ).
Подробнее об этом:
$x = true and false;
Итак, у нас есть следующее. Если вы догадались, что $x
истинно, вы были бы правы. Поскольку =
имеет более высокий прецедент, чем and
.
Переписывание выражения над ним было бы равно этому:
($x = true) and false;
Вот где это смешно.
Если вы должны были сделать:
$x = true && false;
и вы догадаетесь, что $x
истинно, вы ошибаетесь. $x
этом случае $x
на самом деле является ложным.
Вышеприведенное выражение фактически равно:
$x = (true and false);
Зачем? Потому что &&
имеет более высокий прецедент, чем and
.