$var4 = 123; function fn1($p1) { return array('p1' => 1, 'p2' => 2); } if ($var1 = fn1(1) AND $var4 == 123) { print_r($var1); } if ($var2 = fn1(1) && $var4 == 123) { print_r($var2); } if (($var3 = fn1(1)) && $var4 == 123) { print_r($var3); }
Может ли кто-нибудь объяснить технически – в деталях – почему это странное поведение? Ссылки на php.net будут оценены.
Я знаю, что «&&» имеет более высокий приоритет, чем «И», но это меня не объясняет!
PHP: Превосходство оператора
&& имеет более высокий приоритет, чем =, поэтому во втором, если вы назначаете значение fn1(1) && $var4 == 123
(true или false) в $ var2.
В первом случае, если И имеет более низкий приоритет, чем =, поэтому сначала выполняется назначение, затем результат сравнивается.
В третьем случае, если назначение происходит сначала снова, потому что все в parens обрабатывается первым.
&&
имеет более высокий приоритет, чем =
, так что на самом деле происходит нечто большее:
if ($var1 = (fn(1) && $var4 == 123))
Итак, что действительно присваивается переменной $ var1, это логический результат, поэтому вы получаете 1.
Операторы PHP AND
и &&
оба являются логическими и, но and
версия имеет более низкий приоритет привязки, см. http://php.net/manual/en/language.operators.precedence.php