Оператор отрицания имеет более высокий приоритет, чем оператор присваивания, почему он меньше в выражении?
например
if (!$var = getVar()) {
В предыдущем выражении назначение происходит сначала, отрицание позже. Разве отрицание не должно быть первым, тогда назначение?
Левая часть =
должна быть variable
. $var
– variable
, тогда как !$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 ())