它返回 false
在 PHP 7 但 true
在 PHP 8 上。有人可以解释为什么会发生这种情况吗?
var_dump("U0M262" > 100000);
最佳答案
字符串和数字之间的比较没有明显正确的结果。在许多语言中,它只会给出错误;在其他语言中,包括 PHP,该语言试图通过将两个操作数转换为相同类型来理解它,但这涉及对“首选”哪种类型的判断。
从历史上看,PHP 更喜欢比较数字而不是比较字符串:它处理 "U0M262" > 100000
如 (int)"U0M262" > 100000
.自 (int)"U0M262"
没有明显的值(value),它被评估为0
,表达式变为 0 > 100000
,这是错误的。
自 PHP 8 起,this behaviour has changed并且 PHP 现在只对“数字字符串”使用数字比较,例如"42"
显然“看起来像”42
.自 "U0M262"
不符合数字字符串的要求,"U0M262" > 100000
现在被视为 "U0M262" > (string)100000
.这对两个字符串的排序顺序进行了逐字节比较,并发现由于“U”在 ASCII(以及任何 ASCII 派生编码,包括 UTF-8)中出现在“1”之后,因此结果为真。
与以往一样,您可以使用显式强制转换告诉 PHP 您打算进行哪种比较,并在所有版本中获得正确的行为:
var_dump((int)"U0M262" > (int)100000); // bool(false)
var_dump((string)"U0M262" > (string)100000); // bool(true)
(显然,如果你对双方都进行硬编码,这毫无意义,但假设一个或两个都是变量,这就是你的做法。)
关于php - 在 php 8 上使用比较时得到非常奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66739825/