Подтвердить что ты не робот

Почему отрицание происходит последним в выражении присваивания в PHP?

Оператор отрицания имеет более высокий приоритет, чем оператор присваивания, почему он меньше в выражении?

например.

if (!$var = getVar()) {

В предыдущем выражении назначение происходит сначала, отрицание позже. Не должно ли сначала отрицание, затем назначение?

4b9b3361

Ответ 1

Левая часть = должна быть variable. $var является variable, тогда как !$var не является (это a expr_without_variable).

Таким образом, PHP анализирует выражение только по возможности, а именно !($var = getVar()). Приключения никогда здесь не играют.

Примером того, где приоритет = имеет значение, является следующее:

$a = $b || $c // ==> $a = ($b || $c), because || has higher precedence than =
$a = $b or $c // ==> ($a = $b) or $c, because or has lower precedence than =

Ответ 2

Короче говоря, присваивания всегда будут иметь приоритет над левой частью (так как это приведет к ошибке синтаксического анализа в противном случае).

 <?php
 $b=12 + $a = 5 + 6;
 echo "$a $b\n";
 --> 11 23

 $b=(12 + $a) = (5 + 6);
 echo "$a $b\n";
 --> Parse error

В документации PHP есть примечание по этому вопросу: http://php.net/manual/en/language.operators.precedence.php (я догадался, что он был добавлен после вашего вопроса)

Хотя = имеет более низкий приоритет, чем большинство других операторов, PHP все равно позволит выражениям, аналогичным следующим: if (! $a = foo()), и в этом случае возвращаемое значение foo() помещается в $a

Ответ 3

Оператор переговоров должен проверить одно значение на следующем, поэтому, если вы дадите как это

! $var = Getvar()

оператор применим только для следующей переменной, поэтому! var var будет разделен. поэтому нам нужно дать

! ($ var = Getvar())