或 运算符在 PHP 中的行为

2022-08-30 10:53:16

我试图理解操作员的行为。请参阅以下示例:or

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

输出符合预期:bool(true);

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

输出与预期一样:。我以一种比 的优先级更高的方式理解了这一点,所以这就是为什么将 分配给 .bool(false)=Or$ffalse

但是下面的代码与我的想法完全相反。我以为会被分配给它,然后与它自己进行比较。但是,仅当设置了,这意味着它正在检查是否之前已分配给任何内容时,才分配5。$foo5$foo$foo$foo

$foo or $foo = 5; 

谁能解释为什么会这样?


答案 1

基础知识:

  1. 赋值表达式将生成赋值。

    那是什么意思? 是一个表达式,其中赋值运算符赋值。表达式始终返回值本身。就像表达式产生值一样,表达式产生值。这就是它的工作原理:$foo = 'bar'=1 + 23$foo = 'bar''bar'

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

  3. 运算符优先级指示表达式的各个部分分组到子表达式中的顺序。优先级较高的运算符与其操作数一起分组,然后分组为优先级较低的运算符。

因此:

$e = false || true;

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

$f = false or true;

此处的优先级现在低于 ,这意味着赋值操作在 之前分组到一个表达式中。因此,首先计算表达式,其结果是(见上文)。因此,您有一个简单的表达式,接下来计算并得到 ,但没有人关心。or=or$f = falsefalsefalse or truetrue

评估的工作方式如下:

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; 

同样,此处具有较高的优先级,并被视为一个表达式。由于它出现在运算符的右侧,因此仅在必要时才计算表达式。这取决于最初是什么。如果 是 ,则根本不会评估右侧,因为必须是整体的。如果最初有一个 falsey 值,则对右侧进行求值并将其分配给 ,结果为 true-ish,这意味着整体表达式为 ,没有人关心。$foo = 5or$foo$footruetrue or ($foo = 5)true$foo5$foo5true

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

答案 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

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

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

更新:

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

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

我们都知道,虽然循环只在 上执行,因此返回 true。true$row = @mysql_fetch_assoc($result)

达里克的问题也是如此。

$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(因为这是真实的陈述)。

希望大家都能理解。


推荐