php 参数与数字比较,PHP8中字符串与数字的比较更智能

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 次的位置截

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值