48

我试图了解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; 

谁能解释为什么会这样?

4

4 回答 4

49

基础:

  1. 赋值表达式导致赋值。

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

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

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

所以:

$e = false || true;

false || true正在评估,这将导致值true分配给$e。运算符的||优先级高于=,因此false || true被分组到一个表达式中(与 相对($e = false) || true)。

$f = false or true;

这里 nowor的优先级低于=这意味着赋值操作在之前被分组到一个表达式中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
于 2012-08-31T11:47:47.593 回答
20

根据有关逻辑运算符的 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))

我们都知道 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;

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

我希望每个人都能理解。

于 2012-08-31T10:19:08.380 回答
3
$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=falsefalse or truefalse

于 2012-08-31T10:24:49.273 回答
2
<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>

选中此项,您可以为 分配值“5” $foo

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

于 2012-08-31T10:25:36.050 回答