Приоритет логических операторов PHP влияет на результаты присваивания переменных странным образом

$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); } 
  1. Если вы запустите этот простой скрипт, он выдаст странные результаты, по крайней мере, для меня !! Первый вывод из первого выражения if приведет к возврату массива из функции &, назначенной переменной $ var1, что я ожидаю, хорошо?
  2. Второй вывод из второго выражения if приведет к целому числу '1', присвоенному переменной $ var2, которая НЕ ожидается вообще !! Обратите внимание, что единственное, что изменилось, это логический оператор, я использовал '&&', а не 'AND', вот и все!
  3. Третий вывод из третьего выражения if снова приведет к возврату ожидаемого массива из функции &, назначенной переменной $ var3, точно так же, как выражение first if, но wait: я только что принял оператор присваивания в выражении if в скобках, тогда как все еще используя второй код выражения !!

Может ли кто-нибудь объяснить технически – в деталях – почему это странное поведение? Ссылки на 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