PHP中的or运算符的行为
我试图了解or
操作员的行为。 请看下面的例子:
$e = false || true;
var_dump($e);
输出如预期: bool(true);
$f = false or true;
var_dump($f);
输出如预期: bool(false)
。 我以某种方式理解了这一点,即=
具有比Or
更高的优先级,所以这就是$f
被赋予false
。
但下面的代码与我的想法完全相反。 我认为$foo
将被分配到5
,然后与自身进行比较。 但是$foo
只有在$foo
被设置的情况下才会被赋值,这意味着它正在检查$foo
是否被赋值给任何事物,赋值为5。
$foo or $foo = 5;
任何人都可以解释为什么这样吗?
基础:
赋值表达式导致赋值。
那是什么意思? $foo = 'bar'
是一个表达式,其中赋值操作符=
赋值。 表达式总是返回一个值本身。 就像表达式1 + 2
导致值3
,表达式$foo = 'bar'
结果是值'bar'
。 这就是为什么这会起作用:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
布尔操作是短路操作。 如果不需要,双方并不总是被评估。 true || false
true || false
总是true
,因为左手操作数是true
,所以整个表达式必须是true
。 这里甚至没有评估false
。
运算符优先级决定了表达式的哪些部分被分组到子表达式中。 较高优先级的运算符在低优先级运算符之前与其操作数分组。
因此:
$e = false || true;
false || true
false || true
正在被评估,这导致值为true
,它被分配给$e
。 ||
运算符具有比=
更高的优先级,因此false || true
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
最初有一个虚假值,则评估右侧,并将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
根据有关逻辑运算符的php.net网页:
这个:
$e = false || true;
像这样的行为:
$e = (false || true) // If false is true, then $e = false. Otherwise true
这个:
$f = false or true;
将采取这样的行动:
($f = false) or true; // $f = false is true, as the assignment succeeded
这个:
$foo or $foo = 5;
将采取这样的行动:
$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5
对于最后一个,未定义基本上是假的,因此foo等于5。
另外,这里是运算符优先顺序的链接:http://www.php.net/manual/en/language.operators.precedence.php
更新:
好的,现在我们来谈谈主要观点。 就像我们在使用提取查询时所知道的一样:
while($row = @mysql_fetch_assoc($result))
我们都知道while循环只能在true
执行,因此$row = @mysql_fetch_assoc($result)
返回true。
与Daric的问题一样。
$foo or $foo = 5;
基本上是:
$foo or ($foo = 5);
基本上是:
$foo = undefined or ($foo = 5); // $foo = 5 actually returns true
这也是
$foo = undefined or true;
正如我之前提到的,undefined = false,所以因此$ foo = 5(因为这是真正的声明)。
我希望每个人都能理解。
$foo or $foo = 5;
Suppose let say $foo=true or $foo=5;
这里它不会评估后面或运算符expresion,所以输出将是$ foo = 1现在表达式是
$foo=false or $foo=5;
这将后评估或=更高的优先级,以便$foo
作为其中会评估$foo=5
所以输出将是5
但当我们评估$foo=false or true
所以这里将考虑优先级=高,因此输出将是$foo=false
但整个表达式将评估为true,因为false or true
会变为false
上一篇: The behaviour of the or operator in PHP
下一篇: What does this mean?