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.rhkb.cn/news/142996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium —— 网页frame与多窗口处理!

一、多窗口处理. 1.1、多窗口简介 点击某些链接&#xff0c;会重新打开⼀个窗⼜&#xff0c;对于这种情况&#xff0c;想在新页⾯上操作&#xff0c;就 得先切换窗⼜了。 获取窗⼜的唯⼀标识⽤句柄表⽰&#xff0c;所以只需要切换句柄&#xff0c;就可以在多个页⾯灵 活操作了…

影刀自动化采集底层逻辑

hello,大家好&#xff0c;这里是【玩数据的诡途】 接上回 <我的影刀故事> 今天给大家介绍一下整个采集的底层逻辑&#xff0c;包括业务流程自动化也是基于这一套基础逻辑进行展开的&#xff0c;顺便带大家熟悉一下影刀&#xff0c;既然叫影刀系列了&#xff0c;那后续一些…

每日一练 | 华为认证真题练习Day115

1、FEC(Forwarding Equivalence Class)转发等价类&#xff0c;是一组具有某些共性的数据流的集合&#xff1b;FEC可以根据地址进行划分&#xff0c;但是不能根据业务类型、QoS等要素进行划分。 A. 对 B. 错 2、关于OSI参考模型中网络层的功能说法正确的是&#xff1f; A. OS…

NISP证书是什么?NISP含金量如何呢?

一、NISP是什么 NISP证书是国家信息安全水平考试&#xff08;National Information Security Test Program&#xff0c;简称NISP&#xff09;&#xff0c;是由中国信息安全测评中心实施培养国家网络空间安全人才的项目。由国家网络空间安全人才培养基地运营/管理&#xff0c;并…

算法通过村第十关-快排|白银笔记|快排实战

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 文章目录 前言数组第K大总结 前言 这是快排中的经典算法题&#xff0c;但是很多…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller&#xff0c;用于处理请求、获取数据、返回结果(重要) 作…

基于SSM的保险业务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

企业如何识别和满足客户需求的5个要点

随着市场竞争的日益加剧&#xff0c;企业需要更加注重客户需求&#xff0c;以获得持续的发展。而企业在满足客户需求上&#xff0c;则需要遵循一些基本的原则和方法。本文将介绍企业识别和满足客户需求的5个要点。 1、理解客户 企业需要了解客户的需求、想法和行为&#xff0c…

SpringBoot之视图解析

文章目录 前言一、视图解析1.视图解析原理流程 二、模板引擎——Thymeleaf基本语法表达式字面量文本操作数学运算布尔运算比较运算条件运算特殊操作设置属性值-th:attr迭代条件运算属性优先级 提取公共页面th:insertth:replace区别 总结 前言 SpringBoot默认不支持 JSP&#x…

基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

版本控制系统:Perforce Helix Core -2023

Perforce Helix Core是领先的版本控制系统&#xff0c;适用于需要加速大规模创新的团队。存储并跟踪您所有数字资产的更改&#xff0c;从源代码到二进制再到IP。连接您的团队&#xff0c;让他们更快地行动&#xff0c;更好地构建。 通过 Perforce 版本控制加速创新 Perforce H…

【Phoenix】phoenix实现每个Primarykey主键保留N版本数据,CDC数据记录为Changelog格式

一、背景&#xff1a; CDC数据中包含了&#xff0c;数据的变更过程。当CDC写入传统数据库最终每一个primary key下会保存一条数据。当然可以使用特殊手段保存多分记录但是显然造成了数据膨胀。 另外数据湖Hudi(0.13.1)是不支持保存所有Changelog其Compaction机制会清除所有旧版…

信息安全:恶意代码防范技术原理.

信息安全&#xff1a;恶意代码防范技术原理. 恶意代码的英文是 Malicious Code, 它是一种违背目标系统安全策略的程序代码&#xff0c;会造成目标系统信息泄露、资源滥用&#xff0c;破坏系统的完整性及可用性。 目录&#xff1a; 恶意代码概述&#xff1a; &#xff08;1&a…

基于体系结构-架构真题2022(四十一)

给定关系模式R&#xff08;U,F&#xff09;&#xff0c;其中U为属性集&#xff0c;F是U上的一组函数依赖&#xff0c;那么函数依赖的公理系统中分解规则是指&#xff08;&#xff09;为F所蕴含。 解析&#xff1a; 伪传递是x到y&#xff0c;wy到z&#xff0c;则xw到z 传递是z…

AVL Cruise 2020.1 安装教程

文章目录 安装包安装破解 安装包 链接&#xff1a;https://pan.baidu.com/s/1GxbeDj_SyvKFyPeTsstvTQ?pwd6666 提取码&#xff1a;6666 安装 安装文件&#xff1a; 双击setup.exe&#xff1a; 一直netx&#xff0c;中间要修改两次路径&#xff0c;第一次是安装位置&#xf…

Go-Ldap-Admin | Ldap 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

计算机里的神灵(SCIP)

计算机程序的构造和解释 我找到计算机里的神灵了&#xff0c;开心一刻 下面是从MIT官网下载的 SCIP求值器&#xff08;解释器&#xff09;的代码&#xff0c;这个官网是个宝藏库 还有其他视频课程和 SCIP的问题答案和可运行代码 链接&#xff1a;https://ocw.mit.edu/courses/6…

gitee-快速设置

快速设置— 如果你知道该怎么操作&#xff0c;直接使用下面的地址 HTTPS SSH: gitgitee.com:liuzl33078235/esp-idf.git 我们强烈建议所有的git仓库都有一个README, LICENSE, .gitignore文件 初始化 readme 文件 Git入门&#xff1f;查看 帮助 , Visual Studio / TortoiseG…

mysql实际调优

一般实际调优的情况就不需要去考虑mysql数据库结构或者命名优化那些。做这些优化是大动作&#xff0c;也不是咱们一般人去接触到的。 所以我们针对mysql的调优其实大部分还是针对索引进行优化。 我们刚接触这个表的话可以先查询当前表中所有的索引 使用 SHOW INDEX FROM yo…

指针笔试题详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.指针题写出下列程序的结…