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;
任何人都可以解释为什么这样吗?
基础:
-
赋值expression式会生成分配的值。
那是什么意思?
$foo = 'bar'
是一个expression式,其中赋值操作符=
赋值。 expression式总是返回一个值本身。 就像expression式1 + 2
导致值3
,expression式$foo = 'bar'
结果是值'bar'
。 这就是为什么这个工程:$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
-
布尔操作是短路操作。 如果不需要,双方都不会被评估。
true || false
true || false
总是true
,因为左手操作是true
,所以整个expression必须是true
。false
甚至没有被评估在这里。 -
运算符优先级决定了expression式的哪些部分被分组到子expression式中。 更高优先级的运算符在低优先级运算符之前与其操作数分组。
因此:
$e = false || true;
false || true
false || true
正在被评估,这导致值为true
,分配给$e
。 ||
运算符比=
有更高的优先级,因此false || true
false || true
被分组到一个expression式中(与($e = false) || true
相反)。
$f = false or true;
这里现在or
具有比=
更低的优先级,这意味着赋值操作在之前or
被分组到一个expression式中。 所以首先计算$f = false
expression式,其结果是false
(见上)。 那么你有简单的expressionfalse 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
又具有更高的优先级,并被视为一个expression式。 由于它出现在or
运算符的右侧,因此只有在必要时才评估expression式。 这取决于最初的$foo
。 如果$foo
为true
,那么右边将不会被评估,因为true or ($foo = 5)
必须为true
。 如果$foo
最初有一个虚假的值,那么评估右边,将5
分配给$foo
,结果为5
,这就是真实的,这意味着总体expression是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现在expression式是
$foo=false or $foo=5;
在这里,它将评估之后或作为=更高的优先,所以$foo
作为哪一个它将评估$foo=5
所以输出将是5
但是当我们评估$foo=false or true
所以这里它会考虑=更高的优先级,所以输出将是$foo=false
但整个expression式将评估为true,因为false or true
将变为false
<?php $foo = false; $foo or ($foo = '5'); echo $foo; ?>
检查这个你可以为$foo
赋值“5”。
比较or
=
具有高优先级..这就是事实…. 🙂