为什么在对数字进行检查时,PHP相等性检查仅查看字符串的开头?

rev*_*nce 0 php

我想知道为什么这样做会起作用:

var_dump(5 == "5 AND SOME TEXT");
Run Code Online (Sandbox Code Playgroud)

输出:

bool(true)
Run Code Online (Sandbox Code Playgroud)

比较如下的浮点数时,也会获得相同的输出:

var_dump(1.234 == "1.234 AND SOME TEXT");
Run Code Online (Sandbox Code Playgroud)

这必须是故意的,因为这是很基本的事情,并且可以在多个PHP版本中使用。我只是不明白这是怎么打算的。

ric*_*aan 6

当你使用等号(==),PHP执行型杂耍如果这两个值是相同类型的不行。将数字与字符串进行比较时,它将尝试将该字符串转换为数字。

在将字符串转换为数字时,如果字符串以有效的数字开头,则将使用。一旦遇到非数字值,PHP就会停止处理字符串的其余部分(如果字符串不是以数字开头,PHP会将其转换为0)。因此,您的字符串"5 AND SOME TEXT"以有效的数值(5)开头,但是一旦PHP找到该空间,它就会停止并且最终以该数值开始5。既然5 == 5,您的结果是true。您的其他字符串也是如此,"1.234 AND SOME TEXT"是直到第一个空格的有效数字。

有两种方法可以解决此问题:

  • 使用相同的运算符(===)。这将确保不会进行任何类型的变戏法,因此5 === "5 AND SOME TEXT"will 的结果false。不利的一面是,由于您要将数字类型与字符串进行比较,因此结果5 === "5"也将是false因为两个值属于不同类型。这可能不是您想要的。
  • 将您的数字转换为字符串。然后,两个值都是字符串,并且不会发生类型杂乱。您最终会得到"5" == "5 AND SOME TEXT"(或(string)5 == "5 AND SOME TEXT"),两者都是false。但是,如果右边的值实际上在数值上是正确的,那么您将获得所需的结果:("5" == "5"或(string)5 == "5")将返回true。