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; 

任何人都可以解释为什么这样吗?

基础:

  1. 赋值expression式会生成分配的值。

    那是什么意思? $foo = 'bar'是一个expression式,其中赋值操作符=赋值。 expression式总是返回一个值本身。 就像expression式1 + 2导致值3 ,expression式$foo = 'bar'结果是值'bar' 。 这就是为什么这个工程:

     $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz'); 
  2. 布尔操作是短路操作。 如果不需要,双方都不会被评估。 true || false true || false总是true ,因为左手操作是true ,所以整个expression必须是truefalse甚至没有被评估在这里。

  3. 运算符优先级决定了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 = falseexpression式,其结果是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 。 如果$footrue ,那么右边将不会被评估,因为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 =具有高优先级..这就是事实…. 🙂

Interesting Posts