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最初是什么。 如果$footrue ,则根本不会评估右侧,因为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

    链接地址: http://www.djcxy.com/p/10097.html

    上一篇: The behaviour of the or operator in PHP

    下一篇: What does this mean?