我正在尝试了解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;
任何人都可以解释为什么会这样吗?
答案 0 :(得分:52)
基础知识:
赋值表达式会产生指定的值。
这是什么意思? $foo = 'bar'
是一个表达式,赋值运算符=
在其中赋值。表达式始终返回值本身。就像表达式1 + 2
得到值3
一样,表达式$foo = 'bar'
会产生值'bar'
。这就是为什么这样做的原因:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
布尔运算是短路运算。如果他们不需要,双方并不总是被评估。 true || false
总是true
,因为左手操作数为true
,因此整个表达式必须为true
。 false
甚至没有在此进行评估。
Operator precedence指示表达式的哪些部分被分组为子表达式。较高优先级的运算符在较低优先级运算符之前与它们的操作数组合在一起。
因此:
正在评估$e = false || true;
false || true
,这会产生值true
,该值已分配给$e
。 ||
运算符的优先级高于=
,因此false || true
被分组为表达式(而不是($e = false) || true
)。
$f = false or true;
此处or
的低于<{em>>的优先级高于=
,这意味着赋值操作在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
。如果$foo
为true
,则根本不会对右侧进行评估,因为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
答案 1 :(得分:24)
根据php.net webpage about Logical Operators:
这:
$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。
与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(因为这是真实的陈述)。
我希望每个人都能理解。
答案 2 :(得分: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
时,它会考虑=更高的优先级,因此输出将为false or true
,但整个表达式将评估为真,因为false
变为{{1}}
答案 3 :(得分:4)
<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>
选中此项,您可以为$foo
分配值“5”。
比较or
=
具有高优先级..这就是事实......:)