PHP8中字符串与数字的比较更智能
PHP8.0发布[1]也有一段时间了,此次发布带来了很多实用且强大的功能,比如:
Named arguments
// php 7.x
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
// php 8.0
htmlspecialchars($string, double_encode: false);
传递参数时,可以通过指定参数名传递。
Constructor property promotion
// php 7.x
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this-x = $x;
$this-y = $y;
$this-z = $z;
}
}
// php 8.0
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
构造器参数向上提升,这个还挺有意思的,构造器中的参数(公众号 正义的程序猿)直接变成了类的属性,大大简化了代码量。
Union types
// php 7.x
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this-number = $number;
// 公众号 正义的程序猿
}
}
new Number('NaN'); // Ok
// php 8.0
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
在之前的版本,申明联合变量类型都是通(公众号 正义的程序猿)过注解的方式,而在8.0中,结合构造函数变量提升,直接在定义的时候申明联合类型,并且在8.0中是严格的,类型不匹配直接在运行时报错。
当然,8.0中的feature不止这些,还有很多。这里来详细说一下Saner string to number comparisons,就是本文的标题。
现象
PHP中在比较时,我们经常这样操作:
10 == '10'
结果符合我们的预期,但这样并不是每次都正确,比如:
// php 7.x
0 == 'foobar' // true
// php 8.0
0 == 'foobar' // false
是不是很诡异
再来一个:
// php 7.x
var_dump(in_array(0, ['foo', 'bar'])); // true
// php 8.0
var_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 | false
42 == " 42" | true | true
42 == "42foo" | true | false
参考:
https://www.php.net/releases/8.0/index.php
https://wiki.php.net/rfc/string_to_number_comparison
PHP8中字符串与数字的比较更智能 相关文章
根据字符串当作变量,进行类名转换
#配置文件中数据PLUGINS = { 'disk': 'src.plugins.disk.DiskPlugin', 'mem': 'src.plugins.mem.MemPlugin', 'nic': 'src.plugins.nic.NicPlugin', }response = {}for k,v in PLUGINS.items(): #将类名从字符串分离出来 file_path,clsname=v.rsplit(".",1) f
php 怎么实现字符串转化小写
php实现字符串转化小写的方法:首先创建一个PHP示例文件;然后通过“strtolower(Hello WORLD.);”方法将指定字符串转化为小写即可。 本文操作环境:Windows7系统、PHP7.1、Dell G3电脑。 strtolower() 函数把字符串转换为小写。 注释:该函数是二进制安全的
js获取数字数组最大值的几种方式
原生 Math.max 方法 Math.max 方法不能接收数组,可以使用ES6的 ... 将数组打散 const arr = [111, 12, 111, 34, 2, 5, 76];console.log(Math.max(...arr)); 当然也可以用 apply 方法调用 console.log(Math.max.apply(null, arr)); 遍历获取最大值 遍历数组
最短编辑距离
题意 给定两个字符串\(A\)和\(B\),现在要将\(A\)经过若干操作变为\(B\),可进行的操作有: 删除–将字符串A中的某个字符删除。 插入–在字符串A的某个位置插入某个字符。 替换–将字符串A中的某个字符替换为另一个字符。 现在请你求出,将\(A\)变为\(B\)至
剑指 Offer 46. 把数字翻译成字符串 dp
地址 https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实
Python字符串及其简单格式化
1.字符串介绍 字符串是字符的序列表示,根据字符串的内容多少分为单行字符串和多行字符串。单行字符串可以由一对单引号(‘)或双引号(“)作为边界来表示,单引号和双引号作用相同,使用单引号时,双引号可以作为字符串的一部分;使用双引号时,单引号可以作为
剑指 Offer 56 - I. 数组中数字出现的次数
一、题目描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 示例 1: 输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1] 示例 2: 输入:nums = [1,2,10,4,1,4,3,
selenium执行js
写一个字符串来定义js代码 使用execute_script()执行js代码 province_js = ''' b= document.querySelector('ul[class="ant-cascader-menu"]:nth-child(1) li:nth-child(1)'); b.click() ''' self._driver.execute_script(province_js) city_js =''' b= doc
MySQL crc32 crc64函数 提高字符串查询效率
一、CRC32概念 CRC全称为Cyclic Redundancy Check,又叫循环冗余校验。CRC32是CRC算法的一种,常用于校验网络上传输的文件。 二:MySQL里如何利用CRC32来加快查询 CRC32的基本特征 #1.CRC32函数返回值的范围是0-4294967296(2的32次方减1) #2.相比MD5,CRC32
MySQL字符串函数:substring_index()的使用详解
定义 SUBSTRING_INDEX - 按分隔符截取字符串 语法 SUBSTRING_INDEX(str, delimiter, count) 返回一个 str 的子字符串,在 delimiter 出现 count 次的位置截