问与答 PHP中or运算符的行为

clayton · 2020-03-20 00:09:59 · 热度: 13

我试图了解or运算符的行为。 请参见以下示例:

$e = false || true;
var_dump($e);

如预期的那样输出:$foo

$f = false or true;
var_dump($f);

预期输出:$foo。我了解到5具有比$foo更高的优先级,因此这就是将$foo分配给$foo的原因。

但是下面的代码与我的想法完全相反。 我认为将$foo分配给5,然后与其进行比较。但是,只有在设置$foo时才分配$foo,这意味着它正在检查是否将$foo之前分配了任何东西,将5分配给它。

$foo or $foo = 5; 

谁能解释为什么会这样?

猜你喜欢:
共收到 4 条回复
tamir #1 · 2020-03-20 00:09:59

基础:

  1. 赋值表达式产生赋值。

    这意味着什么? true || false是一个表达式,分配运算符true在其中分配一个值。 表达式总是返回自身的值。 就像表达式true得出值3一样,表达式$foo = 'bar'得出值'bar'。这就是为什么这样的原因:

    true || false
  2. 布尔运算是短路运算。 如果不需要,双方都不会总是得到评估。 总体上,true || false始终为true,因为左手操作数为true,所以整个表达式必须为$foo = 5。此处甚至不对or求值。

  3. 运算符优先级指示将表达式的哪些部分分组到子表达式中。 高优先级运算符的操作数分组在低优先级运算符之前。

因此:

$foo = 5

正在评估$foo = 5,结果为or,该值已分配给$foo$foo运算符的优先级高于true,因此true or ($foo = 5)被分组为一个表达式(与true相对)。

$foo = 5

现在,此处$foo = 5的优先级低于27556493114920152015,这意味着分配操作在$foo之前被分组为一个表达式。因此首先评估$foo表达式,其结果为true(请参见上文)。 因此,您将得到一个简单的表达式true or ($foo = 5),该表达式将在下一个求值后得出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 = 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
ned #2 · 2020-03-20 00:10:01

按照关于逻辑运算符的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/zh/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(因为这是正确的语句)。

希望大家都能理解。

vlado #3 · 2020-03-20 00:10:02
$foo or $foo = 5;

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

在这里它不会在运算符或运算符之后求值,所以输出将是$ foo = 1       现在的表达式是

$foo

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

ernesto #4 · 2020-03-20 00:10:03
<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>

选中此选项,可以为or分配值“ 5”。

相比or =具有较高的优先级。就是这样。...:)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册