PHP 变动:PHP 8 版本下字符串与数值的弱比较

文章目录

  • 参考
  • 环境
  • 声明
  • 弱比较
      • 隐式类型转换
      • 字符串连接
      • 数学运算
      • 布尔判断
      • 相等运算符
  • 字符串与数值的弱比较
      • 字符串转化为数值的具体规则
      • 字符串与数值的弱比较
          • 一般情况
          • 科学计数法
            • 前缀 0E 与 0e
  • PHP8 在字符串与数值的弱比较方面做出的改动
      • 数值字符串
      • 优化

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 手册PHP Manual
wsfgrdghPHP8中字符串与数字的比较更智能
PHP RFC 文档Saner string to number comparisons

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9

注:

本篇文章在除大板块 PHP8 在字符串与数值的弱比较方面做出的改动 外均不使用 8.x.x 版本的 PHP 解释器。

声明

本篇文章所介绍的 弱比较 适用于任何执行 非严格比较 的操作,包括但不限于 ==!=>>=in_array()array_search()。为使文章更为 精简,本文将专注于 == 的弱比较讲解。

弱比较

隐式类型转换

在 PHP 中,隐式类型转换(Implicit Type Conversion) 是指在某些操作中,PHP 会 自动 将数据 由一种数据类型转换为另一个数据类型,而 无需显式 地编写 类型转换 代码。

PHP 的隐式类型转换会按照一定规则(具体情况具体分析)对操作数进行转换,以使得相关操作 能够正常进行 下去。

字符串连接

在通过使用句点运算符 . 进行字符串连接操作时,PHP 将会尝试将其他数据类型 转换为字符串数据类型。对此,请参考如下示例:

<?php// 尝试将两个字符串进行拼接
var_dump('Hello ' . 'World');// 尝试将数值与字符串进行拼接
var_dump('1 + 1 = ' . 2);// 尝试将两个数值进行拼接
var_dump(1 . 1);

执行效果

string(11) "Hello World"
string(9) "1 + 1 = 2"
string(2) "11"

数学运算

在通过 数学运算符 进行数学运算时,PHP 将会尝试将其他数据类型的数据 转换为数值类型。对此,请参考如下示例:

<?php// 尝试对布尔值 true 与数值 1 进行减法运算
var_dump(true - 1);// 尝试对布尔值 true 与 false 进行加法运算
var_dump(true + false);// 尝试进行字符串之间的乘法运算
var_dump('2' * '150');// 字符串 100djdj 将被转换为 100
var_dump('100djdj' / 10);// 字符串 djdj100 将被转换为零
var_dump('djdj100' / 10);

执行效果

int(0)
int(1)
int(300)
int(10)
int(0)

布尔判断

在需要使用布尔值的位置,PHP 将尝试将非布尔值的数据 转换为布尔类型的数据。对此,请参考如下示例:

<?php// 尝试将空字符串转换为布尔值
if(''){print('Hello World' . "\n");
}// 尝试将字符串 Hello World 转换为布尔值
if('Hello World'){print('Hello China' . "\n");
}// 尝试将数值 999 转换为布尔值
if(999){print('久久久' . "\n");
}

执行效果

Hello China
久久久

相等运算符

在 PHP 中存在两种相等运算符,即弱类型相等运算符 == 和强类型相等运算符 ===,两者都可以用于判断两个操作数是否相等,但存在一些区别。

两者的 区别 在于,弱类型相等运算符 在对操作数进行比较之前,将 自动 进行类型转换以 使两者所属的数据类型相同。而 强类型相等运算符 在进行比较时,要求两个值的 类型 都必须 完全相同不进行类型转换。对此,请参考如下示例:

<?php// 在通过弱类型比较运算符对数值与字符串进
// 行比较时,PHP 优先将字符串转换为数值。// 由于两者转换为同一类型后,值相同,
// 故将返回 true。
var_dump('123' == 123);// 由于两者的数据类型及值均不相同,故
// 将返沪 false。
var_dump('123' === 123);

执行效果

bool(true)
bool(false)

字符串与数值的弱比较

字符串转化为数值的具体规则

在 PHP 的 隐式类型转换过程 中,字符串转化为数值的具体规则如下:

  1. 若字符串的 首个字符不为数字且不为空格等空白字符,则将该字符串转化为零。
  2. 若字符串的 首个字符不为数字但为空格等空白字符,则尝试读取其余字符,将遇到数字前的所有空白字符均转化为零,将遇到数字后的所有空白字符视为非数字字符;在遇到非数字字符时停止对字符串的读取并将已读取字符转化为数值
  3. 若字符串的 首个字符为数字,则尝试读取其余字符,在遇到非数字字符(除符合科学计数法格式的字符 e 或 E外)时停止对字符串的读取并将已读取字符转化为数值

举个栗子

目标字符串转化结果
Hello1230
1Hell2o31
0x8aHello1230
9.384Hello9.384
0008743738Hello9488743738
1.223e100122.3

注:

PHP 在执行字符串到数值的隐式类型转换过程,均 以十进制表示法 为依据。同上述例子一般,0x8aHello123 中的 0x8a 并不会被识别为十六进制数,由于十进制中不存在 x,故 PHP 在识别到字符 x 时就将立即停止读取并将读取到的字符串 0 转化为数值,故最终的转化结果为零。

字符串与数值的弱比较

一般情况

在 PHP 中,若字符串与数值进行弱比较,则 PHP 将 优先把字符串转换为数值 后再进行比较。对此,请观察如下示例:

<?phpvar_dump('Hello123' == 0);  # bool(true)
var_dump('1Hell2o3' == 1);  # bool(true)var_dump('0x8aHello123' == 0);  # bool(true)var_dump('9.384Hello' == 9.384);  # bool(true)var_dump('0363534Hello' == 0);  # bool(false)
var_dump('0008743738Hello948' == 8743738);  # bool(true)var_dump('   8996Hello ' == 8996);  # bool(true)
var_dump('   89 9 ' == 89090);  # bool(false)
var_dump('   89 9 ' == 89);  # bool(true)var_dump('' == 0);  # bool(true)

注:

空字符串 在字符串到数值的隐式类型转换过程中将被转化为

科学计数法

在 PHP 中,eE 均表示 科学计数法(Scientific Notation)。科学计数法由 基数指数 两部分组成,常用于 表示非常大或非常小的数值。

在科学计数法中,基数 通常 是一个浮点数,介于 110 之间,而指数是一个整数,表示要将基数乘以 10 的多少次方。基数与指数之间以字符 eE 进行分隔。

举个栗子

<?php// 3.78 * 10 ^ 3
var_dump(3.78e3);
var_dump('3.78e3' == 3780);// 3 * 10 ^ -1
var_dump(3E-1);
var_dump('3E-1' == 0.3);

执行效果

float(3780)
bool(true)
float(0.3)
bool(true)
前缀 0E 与 0e

零的任何指数次幂都为零,因此以 0E0e 为前缀的科学计数法表示的数值的结果都将为数值零。对此,请参考如下示例:

<?phpvar_dump(0e3280);
var_dump('0e30284083' == 0);
var_dump('0esjlfjsld' == 0);

执行效果

float(0)
bool(true)
bool(true)

PHP8 在字符串与数值的弱比较方面做出的改动

数值字符串

数值字符串 是指一个包含数字字符的字符串,数值字符串可以用于直接表示一个数值。

举个栗子

"123"
"-42"
"+384""3.14"
"-0.5"
"0.0000"
"00000000.0000""2.5e3"
"1.2e-2"
"+42.0E0""0004746"
"0305940"
"       484748      "
" 4847      "
"               3847"

注:

  1. 包含 代表其他进制(非十进制)数值的符号 的字符串不能被称为数值字符串(数学中通常不使用这些符号来标识其他进制的数值),如 0x1F0b10101 等字符串。在 PHP 中,八进制数值 通过 前导零 来表示,但在 数值字符串中,前导零将 被视为普通数字,不具备标识八进制数值的功能
  2. 如果存在将其他进制(非十进制)的字符串转化为数值的需求,可以考虑使用 intval() 等函数进行显式类型转化。
  3. 包含空格等空白字符的字符串 为什么也可以是数值字符串?你可以理解为 一眼望去是数值的就是数值字符串😔。

优化

PHP8 仍旧保留了隐式类型转换 这一特性,但在字符串与数值的弱比较方面做出了优化。在 字符串与数值的弱比较 过程中,PHP 将 依据字符串的不同 选择 将字符串转换为数值将数值转换为字符串 后再进行比较。具体规则如下:

  1. 若字符串 符合数值字符串的定义,则 PHP 尝试 将字符串转化为数值 后再进行比较。
  2. 若字符串 不符合数值字符串的定义,则 PHP 尝试 将数值转化为字符串 后再进行比较。

举个栗子

<?php# 数值 0x10 将首先转化为十进制数 16
# 后再转化为字符串与 '0x10' 进行比较。
var_dump('0x10' == 0x10);  # bool(false)
var_dump('16' == 0x10);  # bool(true)var_dump('' == 0);  # bool(false)
var_dump('0000.00000' == 0);  # bool(true)var_dump('989   ' == 989);  # bool(true)
var_dump('   989   ' == 989);  # bool(true)
var_dump('0000989' == 989);  # bool(true)var_dump('9847Hello' == 9847);  # bool(false)
var_dump('Hello' == 0);  # bool(false)

PHP8 的这一改动 提高了代码的可预测性降低了许多安全隐患发生的可能。在 PHP8 中,像这类的改动还有许多,也正是如此,PHP8 的开发一度被认为 混入了卓越的安全专家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143502.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据库及分类详细介绍

目录 一、数据库详细介绍1、什么是数据库2、数据库的种类3、常见的数据库4、关系型数据库4.1、关系型数据库介绍4.2、关系型数据库的优缺点4.3、关系型数据库小结 5、非关系型数据库5.1、非关系数据库诞生的背景5.2、非关系型数据库的介绍5.3、非关系型数据库的优缺点5.4、非关…

js中的类型转换

原文地址 JavaScript 中有两种类型转换&#xff1a;隐式类型转换&#xff08;强制类型转换&#xff09;和显式类型转换。类型转换是将一个数据类型的值转换为另一个数据类型的值的过程。 隐式类型转换&#xff08;强制类型转换&#xff09;&#xff1a; 隐式类型转换是 Java…

NSSCTF

[SWPUCTF 2021 新生赛]gift_F12 在源代码界面找到了flag [SWPUCTF 2021 新生赛]jicao 源码 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"…

【Linux】Linux环境配置安装

目录 一、双系统&#xff08;特别不推荐&#xff09; 安装双系统的缺点&#xff1a; 安装双系统优点&#xff08;仅限老手&#xff09;&#xff1a; 二、虚拟机centos7镜像&#xff08;较为推荐推荐&#xff09; 虚拟机的优点&#xff1a; 虚拟机的缺点&#xff1a; ​ …

Molecular Cancer|CDK9抑制诱导表观遗传重编程,揭示了规避淋巴瘤耐药性的策略

细胞周期蛋白依赖性激酶&#xff08;CDK&#xff09;蛋白家族在细胞周期进程&#xff08;如CDK1/2/4/6&#xff09;和RNA转录&#xff08;如CDK7/8/9/11&#xff09;的调控中起着不可或缺的作用。由于染色体区域易位或基因扩增导致的CDKs表达失调与肿瘤发生有关。在淋巴瘤细胞中…

华为云云耀云服务器L实例评测 | 实例评测使用之硬件性能评测:华为云云耀云服务器下的硬件运行评测

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件性能评测&#xff1a;华为云云耀云服务器下的硬件运行评测 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…

爬虫获取一个网站内所有子页面的内容

上一篇介绍了如何爬取一个页面内的所有指定内容&#xff0c;本篇讲的是爬去这个网站下所有子页面的所有指定的内容。 可能有人会说需要的内容复制粘贴&#xff0c;或者直接f12获取需要的文件下载地址一个一个下载就行了&#xff0c;但是如下图十几个一级几十个二级一百多个疾病…

华为云Stack的学习(七)

八、华为云Stack存储服务介绍 1.云硬盘EVS 云硬盘&#xff08;Elastic Volume Service&#xff0c;EVS&#xff09;&#xff0c;又名磁盘&#xff0c;是一种虚拟块存储服务&#xff0c;主要为ECS&#xff08;Elastic Cloud Server&#xff09;和BMS&#xff08;Bare Metal Se…

MySQL - order by排序查询 (查询操作 四)

功能介绍&#xff1a;order by&#xff1a;对查询结果进行排序&#xff0c;执行顺序在查询完结果执行&#xff08;比如where后&#xff09; 排序方式&#xff1a;ASC&#xff1a;升序&#xff08;默认&#xff0c;不用指定&#xff09; DESC&#xff1a;降序 语法&#x…

公司新招了个字节拿36K的人,让我见识到了什么才是测试扛把子......

5年测试&#xff0c;应该是能达到资深测试的水准&#xff0c;即不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;而且还应该能全面掌握数据库等方面的技能&#xff0c;如果技能再高些的话&#xff0c;甚至熟悉分…

GIT提示Another git process seems to be running in this repository

解决方法 1、进入项目里面的.git文件里面找到index.lock删除即可。

05-Zookeeper典型使用场景实战

上一篇&#xff1a;04-Zookeeper集群详解 1. Zookeeper 分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下&#xff0c;性能会下降的比较厉害&#xff0c;主要原因是&#xff0c;所有的连接都在对同一个节点进行监听&#xff0c;当服务器检测到删除事件时&#xff0c…

gym_unity学习笔记

最近学了一段时间gym_unity&#xff0c;把一些资料留在这里 实例 实例gym_unity训练RollerBall&#xff1a;https://blog.csdn.net/alibutter/article/details/120908687实例gyn_unity训练3DBall&#xff1a;https://zhuanlan.zhihu.com/p/554927641?utm_id0 源码&#xff1…

Linux部署elk日志监控系统

目录 一、简介 二、部署elasticsearch 2.1 安装jdk11&#xff08;jdk版本>11&#xff09; 2.2 下载安装包 2.3 授权elk用户 2.4 配置elasticsearch.yml 2.5 启动elasticsearch 三、部署logstash 3.1 启动测试 3.2 可能出现的报错 3.3 指定配置文件启动logstash 3.4 安装El…

DevExpress WinForms图表组件 - 直观的数据信息呈现新方式!(一)

凭借界面控件DevExpress WinForms全面的2D和3D图表类型的集合&#xff0c;DevExpress WinForms的图表控件设计大大简化了开发者直观地向最终用户呈现信息的方式。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完…

【笔记】Splay

【笔记】Splay 目录 简介右旋左旋 核心思想操作a. Splayb. 插入c. 删除 信息的维护例题AcWing 2437. SplayP3369 【模板】普通平衡树 简介 Splay 是一种平衡树&#xff0c;并且是一棵二叉搜索树&#xff08;BST&#xff09;。 它满足对于任意节点&#xff0c;都有左子树上任意…

常见应用层协议

一.HTTP&#xff08;超文本传输协议&#xff09; HTTP 和 HTTPS 二.FTP&#xff08;文件传输协议&#xff09; 三.SMTP&#xff08;简单邮件传输协议&#xff09; 四.POP3&#xff08;邮局协议版本3&#xff09; 五.IMAP&#xff08;互联网消息访问协议&#xff09; 六.DNS&am…

利用证书给pdf文件添加数字签名

文章目录 给pdf文件签名一、文件准备1. 构建印章2. 获取证书方法一 阿里云申请证书方法二 自建证书 二、利用证书给pdf签名三、设定签名位置在指定坐标签名在指定签名域签名 传送门 给pdf文件签名 如何给pdf文件签名&#xff0c;这样pdf文件就具有不可修改性&#xff0c;具有鉴…

钡铼BL302与PLC:提升酿酒业效率与品质的利器

啤酒是人类非常古老的酒精饮料&#xff0c;是水和茶之后世界上消耗量排名第三的饮料。 啤酒在生产过程中主要有制造麦芽、粉碎原料、糖化、发酵、贮酒後熟、过滤、灌装包装等工序流程。需要用到风选机、筛分机、糖化锅、发酵设备、过滤机、灌装机、包装机等食品机械设备。这些食…