如何解决在 php 8 上使用比较时得到非常奇怪的结果
它在 PHP 7 上返回 false
,但在 PHP 8 上返回 true
。有人可以解释为什么会发生这种情况吗?
var_dump("U0M262" > 100000);
解决方法
字符串和数字之间的比较没有明显正确的结果。在许多语言中,它只会给出错误;在其他语言中,包括 PHP,该语言试图通过将两个操作数转换为相同类型来理解它,但这涉及对“首选”哪种类型的判断。
从历史上看,PHP 更喜欢比较数字而不是比较字符串:它将 "U0M262" > 100000
视为 (int)"U0M262" > 100000
。由于(int)"U0M262"
没有明显的值,所以计算为0
,表达式变为0 > 100000
,为false。
从 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)
(显然,如果你对双方都进行硬编码,这毫无意义,但假设一个或两个都是变量,这就是你的做法。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。