为什么PHP相等性检查在检查数字时只查看字符串的开头?
我想知道为什么会这样:为什么PHP相等性检查在检查数字时只查看字符串的开头?,php,Php,我想知道为什么会这样: var_dump(5 == "5 AND SOME TEXT"); 输出: bool(true) 当比较如下浮点数时,也会获得相同的输出: var_dump(1.234 == "1.234 AND SOME TEXT"); 这一定是有意为之,因为这是一件非常基本的事情,可以在多个PHP版本中使用。我不明白这是怎么回事。当您使用相等运算符(==)时,如果两个值不是同一类型,PHP将执行。将数字与字符串进行比较时,它将尝试将该字符串转换为数字 将字符串强制转换为数字时,
var_dump(5 == "5 AND SOME TEXT");
输出:
bool(true)
当比较如下浮点数时,也会获得相同的输出:
var_dump(1.234 == "1.234 AND SOME TEXT");
这一定是有意为之,因为这是一件非常基本的事情,可以在多个PHP版本中使用。我不明白这是怎么回事。当您使用相等运算符(
==
)时,如果两个值不是同一类型,PHP将执行。将数字与字符串进行比较时,它将尝试将该字符串转换为数字
将字符串强制转换为数字时,如果字符串以有效的数值开头。一旦遇到非数值,PHP将停止处理字符串的其余部分(如果字符串不是以数字开头,PHP将把它转换为0
)。因此,字符串“5和一些文本”
以一个有效的数值(5
)开始,但一旦PHP找到该空格,它就会停止,并以数值5
结束。由于5==5
,您的结果是true
。另一个字符串也是如此,“1.234和一些文本”
是第一个空格前的有效数字
有两种方法可以解决此问题:
- 使用相同的运算符(
)。这将确保不进行类型转换,因此==
的结果将是5==“5”和一些文本“
。缺点是,由于要将数字类型与字符串进行比较,false
的结果也将是5==“5”
,因为这两个值的类型不同。这可能不是你想要的false
- 把你的号码转换成字符串。然后,两个值都是字符串,不会发生类型转换。您将得到
(或“5”==“5和一些文本”
),两者都将是(字符串)5==“5和一些文本”
。但是如果右边的值在数字上是正确的,您将得到想要的结果:false
(或“5”==“5”
)将返回(string)5==“5”
true