В PHP побитовое И &
на двух булевых преобразованиях преобразует их в целые числа (то есть один или нулевой) и выполняет И. Когда результат этой операции оценивается как логический, результат фактически эквивалентен той же функциональности, что и логический И &&
.
0 & 1 // 0, false
1 & 0 // 0, false
1 & 1 // 1, true
0 & 0 // 0, false
Proof
Интерн будет ошибочно два оператора, потому что нет никаких причин, чтобы сделать это - вы теряете оценку короткого замыкания и добавить несколько ненужных приведения типов.
Но он действительно работает так же, как логический И в этом сценарии.
В теории, ваш приоритет аргумент является правильным, но это относится только тогда, когда есть неоднозначность:
$foo = $b >= k1;
if ($a == 1 & $foo) $a = 2;
Это может привести другой результат, который вы предназначены, и вы должны написать:
$foo = $b >= k1;
if (($a == 1) & $foo) $a = 2;
// or
if ($a == (1 & $foo)) $a = 2;
... в зависимости от того, что вы хотели.
Но так как вы не можете сделать:
$foo = 0 & $b;
if ($a == $foo >= k1) $a = 2;
... код шоу можно интерпретировать только в одну сторону, так что это будет «безопасным», даже если это не совсем то, что вы хотели.
Тем не менее, по-прежнему очень мало опасности, если вы не начнете смешивания логические и битовые операторы - очередностью-накрест, два типа оператора находятся в непосредственной близости друг к другу, так что-то вроде:
if ($foo & $bar && $baz | $qux) // ...
. .. в серьезной опасности сделать что-то неожиданное.
Стоит также отметить, что на самом деле &
является достаточно надежным (он должен еще дать ожидаемый результат, это просто неэффективно и не будет короткое замыкание) - это |
, которые могли бы начать делать странные вещи.
Однако, вы, очевидно, никогда этого не сделаете, вы бы использовали фигурные скобки, потому что эта версия довольно непрозрачна.
@MarkBaker Он сказал это. Он пытается понять, почему сработавший код казался работать. – Barmar
@MarkBaker Вот что я тоже думал, но он работает так. – Bigood
'0 & 1' === 0! побитовое '&' возвращает биты, которые устанавливаются в обоих операндах. Если один из операндов равен «0», конечным результатом будет '0' –