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