为什么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

PHP正在尝试最好将字符串转换为浮点,因为比较中的第一个类型是浮点,如果您还想检查类型,请使用a==。而且是必读的,这就是语言的工作方式,可能是因为这被认为是当时处理字符串到数字转换的最有用的方式。可悲的是,这使得这个问题脱离了这个网站的主题。是的,我知道身份检查,我只是想知道为什么它在不使用身份时会这样工作。您在第一条评论中回答了这个问题,并且在您链接的文档中进行了更广泛的解释。我猜基本上它会根据它所检查的变量来执行floatval或intval,这会去除值后的所有内容,这使得之后的比较是真实的……谢谢你,我确实使用过它,你的第二个解决问题的建议似乎是一个很好的解决方案:)