php - 在 php 8 上使用比较时得到非常奇怪的结果

标签 php php-8

它返回 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/

相关文章:

php-8 - 从php 5.6移植到8.2,如何表达多维数组的auto/init?

Php MySQL 通过 MySQL 连接数据库不起作用,但 ODBC 可以

使用 "WITH"子句的 PHP PDO SQLite3 问题

php - https 检测——这两种方法的优缺点

php - PHP 是否允许命名参数,以便可以在函数调用中省略可选参数?

php - 迁移到 PHP 8.0 : array_key_exists() improved performance. .. 不理解

PHP/SSH 正则表达式脚本/命令,用于从多个文件中删除相同的恶意软件代码

php - 在 PHP 中用标签链接替换单词

docker - 使用 Docker for Laravel Vapor 在 php8 上安装 Imagick

php - 编译错误 : Cannot use positional argument after named argument