或运算符在 PHP 中的行为


The behaviour of the or operator in PHP

我试图了解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. 赋值表达式会产生分配的值。

    那是什么意思? $foo = 'bar'是一个表达式,其中赋值运算符=赋值。表达式始终返回值本身。就像表达式1 + 2产生值3一样,表达式$foo = 'bar'产生值'bar'。这就是为什么这有效:

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

  3. 运算符优先级指示表达式的各个部分分组到子表达式中的顺序。较高优先级运算符与其操作数分组在较低优先级运算符之前。

因此:

$e = false || true;

正在评估false || true,这将产生值 true ,该值被分配给 $e||运算符的优先级高于=,因此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的,没有人关心。

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

对于最后一个,undefined 基本上类似于 false,因此 foo 等于 5。

此外,下面是运算符优先级顺序的链接:http://www.php.net/manual/en/language.operators.precedence.php

更新:

好的,现在让我们进入重点。就像我们都知道使用提取的查询一样:

while($row = @mysql_fetch_assoc($result))

我们都知道循环只在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;

正如我之前提到的,undefined = false,因此$foo = 5(因为这是真实的陈述(。

希望大家能理解。

$foo or $foo = 5;
Suppose let say $foo=true or $foo=5;

在这里它不会在运算符表达式之后进行评估,因此输出将为 $foo=1 现在表达式是

$foo=false or $foo=5;

在这里,它将在或 as = 更高的优先级之后进行评估,因此$foo它将评估其中的哪个$foo=5因此输出将被5 但是当我们评估$foo=false or true所以这里它会考虑 = 更高的优先级,所以输出将是$foo=false但整个表达式将评估为 true,因为false or true变得false

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

检查这一点,您可以为$foo分配值"5"。

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