2017-10-20 189 views
3

的PHP优先,我读了=and运营商

更高的优先级比方说,你有

$boolone = true; 
$booltwo= false; 
$res = $boolone and $booltwo; 

我已经猜到这会变成假的,因为$res = true and false其中真假等于假。但由于=具有更高的优先级,它应该是真实的。这是这样的

($res = $boolone) and $booltwo; 

这将返回true,但我的问题是为什么它返回true,它不应该返回false?由于$res = $boolone等于true$booltwo默认为false,所以我们有这样的:true and false这通常应该返回false,但是为什么又是true?

简单地说:

($res = $boolone) and $booltwo; 
(true) and false; //returns true? 
+0

如果这是为了实际的实际目的,请尝试'$ res = $ boolone && $ booltwo;' – mega6382

+0

@ mega6382我只是想了解它背后的理论。不实用(还) – KoyaCho

回答

8

你是正确的,

$res = $boolone and $booltwo; 

相当于

($res = $boolone) and $booltwo; 

由于运算符优先级,

$res = $boolone 

先评估,与$boolone值分配给$res ....

$booltwo然后与第一次评估结果(true and false)的结果and版,但你什么都不做与评价,所以它被简单地丢弃...它没有被分配到$res,因为该分配已经由第一次评估完成。

如果你

var_dump($res = $boolone and $booltwo); 

然后你会看到被丢弃的全面评估的结果,并$res仍然true

+0

很好的答案'+ 1' –

+0

@MarkBaker谢谢你的好和详细的答案。但是,您的意思是我们对该评估没有做任何事情? – KoyaCho

+0

'$ res = $ boolone和$ booltwo'被评估.....那么评估的结果会发生什么?没有!除非你在我的答案中显示'var_dump()'的东西,它显示结果;或'$ res2 =($ res = $ boolone和$ booltwo);',它将完整表达式的结果赋值给'$ res2'('$ boolone'仍然总是赋给'$ res')....那么你对评估的最终结果并没有做任何事情 –

0

你错在这里:

这返回true,但我的问题是为什么它返回true, 不应该返回false?

那么,它不会返回true。它返回false。可能您误认为(true) and false的结果与$res的内容等于($res = $boolone)。您没有将结果(true) and false分配给$res

2

我使用PHP 5.6.30进行了测试,但是我没有得到结果,暗示=绑定比&&更紧密。

<?php 
$boolone = true; 
$booltwo = false; 

var_dump($res = ($boolone && $booltwo)); 
var_dump($res); 

var_dump($res = $boolone && $booltwo); 
var_dump($res); 

var_dump(($res = $boolone) && $booltwo); 
var_dump($res); 

输出:

bool(false) // $res = ($boolone && $booltwo) ... $res = (true && false) 
bool(false) // $res after assignment is false 

bool(false) // $res = $boolone && $booltwo ... $res = true && false 
bool(false) // $res after assignment is false 

bool(false) // ($res = $boolone) && $booltwo ... ($res = true) && false 
bool(true) // $res after assignment is true 

结论:

分配绑定默认比&&更紧。你必须使用parens来覆盖它。

更新:正如@Piyin在评论中指出的,&&与PHP中的and不一样。页面https://secure.php.net/manual/en/language.operators.precedence.php显示它们落在运算符优先级层次结构中的两个不同位置。

https://secure.php.net/manual/en/language.operators.logical.php状态:

其原因的两个不同的变体“和”和“或”运算符是,它们在不同的优先级操作。 (请参阅Operator Precedence。)

+1

你是对与错。你正在用'&&'而不是'和'来测试。相关信息:http://php.net/manual/en/language.operators.precedence.php两项测试都加入了:https://3v4l.org/iLrsH – Piyin

+1

@Piyin,谢谢,不错的提示!我已经更新了我的答案。 –