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

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

например

if (!$var = getVar()) { 

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

Solutions Collecting From Web of "Почему отрицание происходит последним в выражении присваивания в PHP?"

Левая часть = должна быть variable . $varvariable , тогда как !$var не является (это 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 = 

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

  <?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

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

! $ var = getVar ()

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

! ($ var = getVar ())