类型杂耍和布尔人
我一直在阅读类型杂耍和布尔的PHP文档,但我仍然不明白为什么这个比较评估为真。 我的[不正确]理解告诉我,在下面的if语句中,整数0被认为是FALSE,而“a”是非空字符串被认为是TRUE。 因此,我预计这个比较将解析为FALSE == TRUE并最终为FALSE。 我哪部分错了?
<?php
if(0 == "a"){
$result = "TRUE";
}else{
$result = "FALSE";
}
//$result == "TRUE"
?>
http://codepad.viper-7.com/EjxBF5
当PHP进行字符串<=>整数比较时,它会尝试以智能的方式将字符串转换为数字。 假设是,如果你有一个字符串“42”,那么你想比较值42与另一个整数。 当字符串不以数字开头时,它的值为零。
从文档:
该值由字符串的最初部分给出。 如果字符串以有效的数字数据开头,则这将是使用的值。 否则,该值将为0(零)。
这种行为也可以在比较文档中推断出来(查看第一个示例中的第一行)。
你的错误是你假设operator ==
在比较它们之前强制每个操作数为布尔值。 它没有这样的事情。
会发生什么是因为你正在比较一个整数到一个字符串,该字符串被转换为一个整数(在这种情况下"a" converts to 0
),然后执行比较0 == 0
。
如果您使用严格的比较===
而不是==
,它将起作用。 严格的比较也检查变量的类型,所以0 === 'a'
将是错误的。