我想了解的行为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;
谁能解释这是为什么?
基础:
赋值表达式导致所分配的值。
那是什么意思? $foo = 'bar'
是一个表达式,其中赋值运算符=
分配一个值。 表达式始终返回值本身。 就像表达式1 + 2
的结果中的值3
,表达式$foo = 'bar'
中的值的结果'bar'
。 这就是为什么这个工程:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
布尔运算是短路操作。 双方如果他们不需要是并不总是评估。 true || false
true || false
永远是true
整体,因为左手操作数是true
,所以整个表达式必须是true
。 false
甚至没有在这里被评估。
运算符优先级指示,其中表达的顺序部分被分组为子表达式。 更高的优先级运营商都低优先级运营商之前,它们的操作数进行分组。
因此:
$e = false || true;
false || true
false || true
正被评估,这导致值true
,其被分配到$e
。 该||
操作者具有更高的优先级比=
,因此false || true
false || true
被分组到表达(相对于($e = false) || true
)。
$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
现在:
$foo or $foo = 5;
这里,再次, $foo = 5
具有更高的优先级,被视为一个表达。 因为它发生在的右侧or
运算符,表达仅在必要时进行评价。 这取决于什么$foo
最初。 如果$foo
是true
,右手边将无法在所有的评估,因为true or ($foo = 5)
必须是true
整体。 如果$foo
具有falsey值最初虽然,右手侧被评估和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
由于按照有关逻辑运算符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是基本上像假的,因此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;
正如我前面所提到的,不确定= false时,等于是$ FOO = 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
<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>
勾选此您可以指定值“5”为$foo
。
比比较or
=
具有高优先级..那是事实.... :)