2014-02-11 75 views
0

为什么PHP在逻辑AND返回FALSE时返回0,但当条件AND返回FALSE时不返回0?证人:为什么PHP在逻辑AND上不返回'0'作为FALSE?

php > function a(){ 
php { echo "a"; 
php { return FALSE; 
php { } 

php > function b(){ 
php { echo "b"; 
php { return TRUE; 
php { } 

php > echo (a() && b())."\n"; 
a 
php > 

php > echo (a() & b())."\n"; 
ab0 
php > 

注意,第二echo语句0结束,但先不。为什么?

+0

它应该返回一个T_PARSE错误,因为aa()是未定义的。 – Tularis

+0

您未测试返回值。您正在测试铸造到字符串。 –

+0

你在这个链接中有一个解释http://stackoverflow.com/questions/2376348/difference-between-and-in-php –

回答

5

&&返回一个布尔值。当转换为字符串时,布尔型false'',为空字符串。
&是一个位和(不是一个“条件和”,无论这是什么),作为结果产生一个数字(或二进制blob,取决于参数)。在这种情况下,操作结果编号为0

+0

这是不完全正确的。问题实际上是由短路造成的。虽然这会隐藏布尔值 – Tularis

+0

这是完全正确的。短路解释了'a' /'ab',而不是'0'。 – deceze

+0

谢谢!你指出了我没有意识到的三件事:1)有条件的和/或不是我认为的那样,2)我正在执行按位操作,以及3)TRUE和FALSE在转换为字符串时返回的值。试图猜测其他语言(例如Python)如何将它们的布尔值转换为字符串也是很有启发性的。 – dotancohen

2

在第二种情况下

php > echo (aa() & b())."\n"; 

是逐位AND。您需要使用&&进行比较

+1

正确。所以输出是一个数字,而不是布尔值。 – arkascha

+0

是的,你是对的 –

0

其实,所提供的答案都不完全正确。正确的答案是三倍。

这里的“问题”是& &是一个短路运营商。所以它基本上从最左边的论点向右边一个一个地移动。对于每一个它检查它是否返回true,如果不是,它会停止并且不会执行下一个语句。 PHP Documentation on logical operators

Ergo:在第一种情况下,由于短路只能看到一个(而不是b)。然后你也看不到0,因为它是一个布尔值(不是int)。

然后在第二种情况下,您会看到一个整数0,因为他使用的是按位AND而不是逻辑。

+0

那么?这是如何解释“0”的存在与否的? – deceze

+0

正如第一个答案中所解释的,缺少0。而在第二种情况下,它是由按位AND引起的,它返回一个int,如第二个答案所解释的。 – Tularis

相关问题