基础:
>赋值表达式将生成分配的值。
这意味着什么? $ foo =’bar’是一个表达式,其中赋值运算符=赋值。表达式总是返回一个值本身。就像表达式1 2导致值3,表达式$ foo =’bar’导致值’bar’。这就是为什么这样工作:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
>布尔运算是短路运算。如果他们不需要是双方不总是评估。真|| false总是真实的,因为左边的操作数是真的,所以整个表达式必须是真的。 false甚至不在这里评估。
> Operator precedence指示表达式的哪些部分被分组为子表达式。较高优先级运算符与较低优先级运算符之前的操作数分组。
因此:
06001
false || true将被计算,这将导致值true,它被分配给$ e。 ||运算符的优先级高于=,因此false || true被分组到一个表达式中(与($ e = false)|| true相反)。
06002
这里现在或具有比$低的优先级,这意味着赋值操作被分组到一个表达式之前或。所以首先评估$ f = false表达式,其结果为false(见上文)。所以,然后你有简单的表达式false或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
现在:
06004
这里,$ foo = 5具有更高的优先级,并被视为一个表达式。因为它出现在or运算符的右侧,所以只有在必要时才评估表达式。这取决于$ foo最初是什么。如果$ foo为true,右侧将不会被计算,因为true或($ foo = 5)必须是整体。如果$ foo最初有一个falsey值,右侧将被评估,5被赋值给$ foo,结果是5,这是true-ish,这意味着整个表达式是真的,没有人关心。
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