逻辑AND运算符上的奇怪行为

时间:2019-04-16 11:07:03

标签: php operators boolean-expression

有人能解释这种行为吗?

<?php

$var1 = true;

$var2 = 0;

$var3 = $var1 AND $var2;

var_export($var3); // Output: true

var_export(true AND 0); // Output: false    

var_export($var1 AND $var2); // Output: false

输出来自PHP 7.0

为什么第一个输出为true而第三个输出为false

顺便说一句:$var20还是false并不重要。行为是相同的。

@all:我知道我应该使用&&,而且我总是这样做!

2 个答案:

答案 0 :(得分:5)

实际上是因为&&AND不同。

$var1 = true;
$var2 = 0;

$var3 = $var1 && $var2;
var_export($var3); // Output: false

$var3 = $var1 AND $var2;
var_export($var3); // Output: true

&&情况下,您实际上写了$var3 = ( $var1 && $var2 )

AND情况下,您实际上写了( $var3 = $var1 ) AND $var2

这是因为=的优先级高于AND,但是&&的优先级高于=

答案 1 :(得分:1)

这是因为您使用了AND-see here for full docs

但简而言之:

  

$ a和$ b |和|如果$ a和$ b都为TRUE,则为TRUE。

现在让我们接受您的代码:

$var1 = true; # this is true
$var2 = 0; # this is false
$var3 = $var1 && $var2; # this will be false as $var2 is false

var_export($var3); # my machine shows false
var_export(true && 0); # this shows false as expected, 0 == false
var_export($var1 && $var2); # $var2 is false. This shows false

编辑

真正的原因是&&的存在更高-这就是为什么上面的代码执行我原本认为应该使用AND来做的原因。并非如此,请参见此处:

$g = true && false;

# The constant true is assigned to $h before the "and" operation occurs
# Acts like: (($h = true) and false)
$h = true and false;

var_dump($g, $h);

# outputs:
# bool(false)
# bool(true)

所以您的代码按预期运行,只是与我最初的想法不同。