当然,8.0中的feature不止这些,还有很多。这里来详细说一下Saner string to number comparisons,便是本文的标题。
征象PHP中在比较时,我们常常这样操作:
10 == '10'
结果符合我们的预期,但这样并不是每次都精确,比如:

// php 7.x0 == 'foobar' // true // php 8.00 == 'foobar' // false
是不是很诡异?
再来一个:
// php 7.xvar_dump(in_array(0, ['foo', 'bar'])); // true// php 8.0var_dump(in_array(0, ['foo', 'bar'])); // false
还有:
// php 7.x$v = 0;switch ($v) { case 'bar': echo 'baaar' . PHP_EOL; case 0: echo 'foo' . PHP_EOL;}// 输出:// baaar// foo// PHP 8.0// 输出// foo
为什么
先来说一下PHP中的比较运算,分为两类,严格类型(===,!==)和非严格类型(==, !=, >, >=, 两者的紧张差异如下:
严格类型比较底层用的是strcmp(),非严格类型利用的是所谓的“智能”比较,即将字符串转为数字比拟在比较数组时,严格类型不只会比较值,还会比较索引的顺序,非严格类型只会大略的比较值在比较工具时,严格类型利用工具标识符比较,非严格类型只会比较工具的值在利用==比较数字和字符串时,PHP 8.0之前的版本会先将字符串转换为数字,之后再做两个数字间的比较,这也便是为什么上门0 == "foobar" = true了。
Saner string to number comparisons文章标题说PHP8中字符串与数字的比较更智能,详细智能在哪里?针对上面的问题,8.0当中引入Saner string to number comparisons这个特性[2],底层详细的操作为:当比较数字字符时,利用数字与数字比拟,而其他字符与数字比较时,统一利用字符串比较。我们来通过一个表格来比拟下前后的变革:
Comparison | Before | After------------------------------ 0 == "0" | true | true 0 == "0.0" | true | true 0 == "foo" | true | false 0 == "" | true | false42 == " 42" | true | true42 == "42foo" | true | false
如果喜好,可以关注我哦~
参考:
https://www.php.net/releases/8.0/index.phphttps://wiki.php.net/rfc/string_to_number_comparison