Сегодня нашел интересный фрагмент кода. Упрощенный, он выглядит так:
$var = null; $var or $var = '123'; $var or $var = '312'; var_dump($var);
Дело в том, что, как я знаю, приоритет присваивания выше, чем OR
, поэтому, как я полагаю, var_dump
должен выводить 312
(first-assign, second-compare логически). Но результат делен, я получаю 123
(сначала – проверьте, преобразует ли $var
в true
, second – if not, присваивает значение).
Вопросы в том, как это работает?
Почему поведение одинаково для or
||
?
Вы можете увидеть примеры этого поведения в Logical Operators
Также вы можете прочитать статьи о короткозамкнутой оценке
Выражение короткого замыкания
x Sand y
(с использованием Sand для обозначения короткого замыкания) эквивалентно условному выражению,if x then y else false;
выражениеx Sor y
равносильно тому,if x then true else y
.
В php.
return x() and y();
равно
if (x()) return (bool)y(); else return false;
return x() or y();
равно
if (x()) return true; else return (bool)y();
Итак, дело не просто в приоритете.
Это так же, как
$var = null; if(!$var)$var = '123'; if(!$var)$var = '321'; var_dump($var);