Ответ 1
Основы:
-
Выражение присваивания приводит к присвоенному значению.
Что это значит?
$foo = 'bar'
- выражение, в котором оператор присваивания=
присваивает значение. Выражение всегда возвращает само значение. Так же, как выражение1 + 2
приводит к значению3
, выражение$foo = 'bar'
приводит к значению'bar'
. Вот почему это работает:$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
-
Булевы операции являются операциями короткого замыкания. Обе стороны не всегда оцениваются, если им это не нужно.
true || false
всегдаtrue
в целом, так как левый операндtrue
, поэтому все выражение должно бытьtrue
.false
здесь даже не оценивается. -
приоритет оператора определяет, в каком порядке части выражения сгруппированы в подвыражения. Операторы с более высоким приоритетом сгруппированы с их операндами перед операторами младшего приоритета.
Таким образом:
$e = false || true;
false || true
, что приводит к значению true
, которому присваивается $e
. Оператор ||
имеет более высокий приоритет, чем =
, поэтому false || true
сгруппирован в выражение (в отличие от ($e = false) || true
).
$f = false or true;
Здесь теперь or
имеет более низкий приоритет, чем =
, что означает, что операция присваивания сгруппирована в одно выражение до or
. Поэтому сначала оценивается выражение $f = false
, результатом которого является false
(см. Выше). Итак, у вас есть простое выражение false or true
, которое оценивается далее и приводит к true
, но о котором никто не заботится.
Оценка работает следующим образом:
1. $f = false or true;
2. ($f = false) or true; // precedence grouping
3. false or true; // evaluation of left side ($f is now false)
4. true; // result
Сейчас:
$foo or $foo = 5;
Здесь снова $foo = 5
имеет более высокий приоритет и рассматривается как одно выражение. Так как это происходит в правой части оператора or
, выражение оценивается, если необходимо. Это зависит от того, из чего $foo
изначально. Если $foo
true
, правая часть не будет вообще оценена, так как true or ($foo = 5)
должна быть true
в целом. Если $foo
имеет значение false, но правая часть оценивается и 5
присваивается $foo
, что приводит к 5
, который является true-ish, что означает, что общее выражение true
, о котором никто не заботится.
1. $foo or $foo = 5;
2. $foo or ($foo = 5); // precedence grouping
3. false or ($foo = 5); // evaluation of left side
4. false or 5; // evaluation of right side ($foo is now 5)
5. true; // result