网站首页 > 开源技术 正文
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
猜你喜欢
- 2024-10-28 PHP使用反向Ajax技术实现在线客服系统
- 2024-10-28 【Linux之树莓派篇】用树莓派搭建外网可访问的个人博客(二)
- 2024-10-28 PHPCMS v9 如何在手机端栏目绑定模板
- 2024-10-28 MAMP PRO如何快速开启PHP报错(phpfpm启动)
- 2024-10-28 PHP 命名空间(namespace)(php命名空间与自动加载)
- 2024-10-28 PHP开发简历怎么写才能脱颖而出?(php开发简历怎么写才能脱颖而出呢)
- 2024-10-28 PHP安装imagick扩展踩过的坑(phpmanager如何安装)
- 2024-10-28 PHP应用如何对接微信公众号JSAPI支付
- 2024-10-28 PHP基础之在Dreamweaver下使用PHP实现文件上传
- 2024-10-28 如何在RHEL8或CentOS8系统上安装和配置最新版的PHP
你 发表评论:
欢迎- 最近发表
-
- 10款鲜为人知的PHP框架(10款鲜为人知的php框架代码)
- 3分钟搞懂反弹shell(反弹shell的常用命令)
- 计算机专业必须掌握的脚本开发语言—shell
- shell 基本语法(shell基本语法set)
- 学习Shell 教程(shell编程学习)
- 一个有意思的PHP Webshell,利用伪协议执行代码
- Linux入门-shell编程-适合小白(linux shell编程是什么)
- GrayLog开源日志管理平台技术文章合集【共58篇】
- AI大模型 MiniMax 基于 Apache Doris 的日志系统,PB 级秒级查询响应
- 互联网大厂后端必看!手把手教你替换 Spring Boot 中的日志框架
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)