2

php,我最亲爱的老朋友。

好的,所以我可以理解为什么字符串 '0' 会是一个虚假值。这是公平的,因为'0'它与松散类型的语言相同0,并且0false松散类型的语言。所以这给出了false== 0== '0'

很好很好......但是!这是怎么回事?

<?php
    print "number of surprised persons: " . ('false' == 0);

输出是....

number of surprised persons: 1

这怎么合理?我是唯一对此感到惊讶的人吗?我没看到什么?

进一步的测试证明整数 0 等于(通过运算符 ==)

0        <-- integer
false    <-- boolean
null     <-- just.. you know, null
'0'      <-- string
''       <-- string
'false'  <-- string
'true'   <-- string
'null'   <-- string

自然,我主要使用 operator === 来比较东西。既然我知道了这一点,我当然必须调整我的程序,对此毫无疑问。但还是!有人能解释一下吗?

4

3 回答 3

8

这是因为,当您将字符串与整数进行比较时,它们不会同时转换为字符串或布尔值 - 它们会转换为整数。对于 PHP,当您考虑它时,这一点也不奇怪(相比之下,我想)。

'true' == 0
// is the same as
(int)'true' == 0
// is the same as
0 == 0
// is the same as
true

这对于任何非数字字符串以及字符串都是如此"0"。打印出来的原因1是因为字符串版本是trueis 1(而字符串版本false是空字符串)。

于 2011-10-12T18:46:14.607 回答
6

至于你关心的输出:

('false' == 0)=布尔TRUE=字符串"1"

echo正在触发字符串上下文。

但是从我刚刚看到的您在下面的评论中,您想了解更多有关比较的信息。看看你做了什么:

Example     Name     Result
$a == $b    Equal    TRUE if $a is equal to $b after type juggling.

因此,您正在对数字与字符串进行非严格比较:

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。(参考

注意:数字,而不是接受答案中所写的整数:

<?php
print "number of surprised persons: " . ('false' == 0.3 - 0.2 - 0.1);

玩得开心。

于 2011-10-12T18:43:17.963 回答
3

假 == 0 为真。True 作为字符串是 '1' 并且在插入值时正在进行隐式转换。

$a = true;
echo "$a"; #1

你可以在这里找到一个 PHP 真值表。我只会推荐 === 比较器,除非您有充分的理由使用 ==

http://php.net/manual/en/types.comparisons.php

于 2011-10-12T18:43:26.310 回答