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

Может кто-нибудь объяснить технически - в деталях - почему это странное поведение? Будем благодарны за ссылки на php.net.

Я знаю, что «&&» имеет более высокий приоритет, чем «И», но это мне не объясняет !!

Ответы [ 3 ]

3 голосов
/ 17 января 2012

PHP: приоритет оператора

&& имеет более высокий приоритет, чем =, поэтому во втором случае if вы присваиваете значение fn1(1) && $var4 == 123 (true или false) для $ var2.

В первом случае, если AND имеет более низкий приоритет, чем =, поэтому назначение происходит первым, а затем сравнивается результат.

В третьем случае, если присвоение происходит первым, потому что все в паранах обрабатывается первым.

2 голосов
/ 17 января 2012

&& имеет более высокий приоритет, чем =, поэтому то, что действительно происходит, выглядит примерно так:

if ($var1 = (fn(1) && $var4 == 123))

Итак, что на самом деле присваивается переменной $ var1, это логический результат, поэтому вы получаете 1.

0 голосов
/ 17 января 2012

Операторы AND и && в PHP оба являются логическими и имеют, но версия and имеет более низкий приоритет привязки, см .: http://php.net/manual/en/language.operators.precedence.php

...