我试图了解or
运营商的行为.请看下面的例子:
$e = false || true;
var_dump($e);
Run Code Online (Sandbox Code Playgroud)
输出符合预期: bool(true);
$f = false or true;
var_dump($f);
Run Code Online (Sandbox Code Playgroud)
输出如预期:bool(false)
.我理解这一点的方式是=
优先级高于Or
,这$f
就是分配给它的原因false
.
但是下面的代码与我的想法完全相反.我认为$foo
将分配给自己5
,然后与自己进行比较.但是$foo
只有在$foo
设置的时候才会被分配,这意味着它正在检查$foo
之前是否分配给任何东西,为它分配5.
$foo or $foo = 5;
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么会这样吗?
dec*_*eze 50
基础:
赋值表达式将生成指定的值.
那是什么意思?$foo = 'bar'
是一个表达式,赋值运算符赋值=
.表达式始终返回值本身.就像表达式1 + 2
得到的值一样3
,表达式会$foo = 'bar'
产生值'bar'
.这就是为什么这样做的原因:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
Run Code Online (Sandbox Code Playgroud)布尔运算是短路运算.如果他们不需要,双方并不总是被评估.true || false
总是true
总的来说,因为左手操作数是true
,所以整个表达式必须是true
.false
甚至没有在这里评估.
运算符优先级指示表达式的哪些部分被分组为子表达式.较高优先级的运算符在较低优先级运算符之前与其操作数组合在一起.
因此:
Run Code Online (Sandbox Code Playgroud)$e = false || true;
false || true
正在评估,这将导致true
分配给的值$e
.的||
操作者具有更高的优先级比=
,因此false || true
被分组到表达(相对于($e = false) || true
).
Run Code Online (Sandbox Code Playgroud)$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
Run Code Online (Sandbox Code Playgroud)
现在:
Run Code Online (Sandbox Code Playgroud)$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
Run Code Online (Sandbox Code Playgroud)
Luc*_*emy 20
这个:
$e = false || true;
Run Code Online (Sandbox Code Playgroud)
行为如下:
$e = (false || true) // If false is true, then $e = false. Otherwise true
Run Code Online (Sandbox Code Playgroud)
这个:
$f = false or true;
Run Code Online (Sandbox Code Playgroud)
会这样做:
($f = false) or true; // $f = false is true, as the assignment succeeded
Run Code Online (Sandbox Code Playgroud)
这个:
$foo or $foo = 5;
Run Code Online (Sandbox Code Playgroud)
会这样做:
$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5
Run Code Online (Sandbox Code Playgroud)
对于最后一个,undefined基本上是假的,因此foo等于5.
此外,这是运算符优先顺序的链接:http://www.php.net/manual/en/language.operators.precedence.php
更新:
好的,现在让我们谈谈要点.就像我们在使用获取的查询时所知道的一样:
while($row = @mysql_fetch_assoc($result))
Run Code Online (Sandbox Code Playgroud)
我们都知道while循环只执行true
,因此$row = @mysql_fetch_assoc($result)
返回true.
与达里奇的问题相同.
$foo or $foo = 5;
Run Code Online (Sandbox Code Playgroud)
基本上是:
$foo or ($foo = 5);
Run Code Online (Sandbox Code Playgroud)
基本上是:
$foo = undefined or ($foo = 5); // $foo = 5 actually returns true
Run Code Online (Sandbox Code Playgroud)
这也是
$foo = undefined or true;
Run Code Online (Sandbox Code Playgroud)
正如我之前提到的,undefined = false,因此$ foo = 5(因为这是真实的陈述).
我希望每个人都能理解.