的PHP中的行为或操作员(The behaviour of the or operator in P

2019-06-27 15:19发布

我想了解的行为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; 

谁能解释这是为什么?

Answer 1:

基础:

  1. 赋值表达式导致所分配的值。

    那是什么意思? $foo = 'bar'是一个表达式,其中赋值运算符=分配一个值。 表达式始终返回值本身。 就像表达式1 + 2的结果中的值3 ,表达式$foo = 'bar'中的值的结果'bar' 。 这就是为什么这个工程:

     $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz'); 
  2. 布尔运算是短路操作。 双方如果他们不需要是并不总是评估。 true || false true || false永远是true整体,因为左手操作数是true ,所以整个表达式必须是truefalse甚至没有在这里被评估。

  3. 运算符优先级指示,其中表达的顺序部分被分组为子表达式。 更高的优先级运营商都低优先级运营商之前,它们的操作数进行分组。

因此:

$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最初。 如果$footrue ,右手边将无法在所有的评估,因为true or ($foo = 5)必须是true整体。 如果$foo具有falsey值最初虽然,右手侧被评估和5被分配给$foo ,这导致5 ,这是真实的上下的,这意味着总体表达是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


Answer 2:

由于按照有关逻辑运算符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

对于最后一个,undefined是基本上像假的,因此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。

同样的,达里克的问题。

$foo or $foo = 5;

基本上是:

$foo or ($foo = 5);

这基本上是:

$foo = undefined or ($foo = 5); // $foo = 5 actually returns true

这也是

$foo = undefined or true;

正如我前面所提到的,不确定= false时,等于是$ FOO = 5(因为这是真正的语句)。

我希望大家能够理解。



Answer 3:

$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 ,但是整个表达式会为真,因为false or true变成false



Answer 4:

<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>

勾选此您可以指定值“5”为$foo

比比较or =具有高优先级..那是事实.... :)



文章来源: The behaviour of the or operator in PHP