php8世界上最好的语言新版本特性

2024-04-02 23:58

本文主要是介绍php8世界上最好的语言新版本特性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:https://www.phpmianshi.com/?id=203

本文只会讲述新特性的一些关键点,更详细的介绍请认真阅读官方文档。

01 Union Types(联合类型)

说明一点,从 PHP 7 开始,支持下面这样的语法:

 

function sum(int $a, int $b): int {
    return $a + $b;
}

是不是越来越强类型的感觉?虽然如此,但在非严格类型模式下(strict_types=0,这是默认值),你依然可以这么调用:

 

sum(1.2, 3);

但因为函数参数接收 int 类型(返回值也是 int 类型),因此上面结果是 4,而不是 4.2。如果是严格模式下,只允许传递 int 类型了。(sum('1.2', 3.0) 结果也是 4)

如果希望结果输出 4.2,同时又保持类型约束,怎么办?PHP 不支持方法重载。这就有了 PHP 8 的联合类型。

联合类型接受多个不同的类型做为参数。声明联合类型的语法为 T1|T2|...。

所以,上面代码可以改为:

 

function sum(int|float $a, int|float $b): int|float{
  return $a + $b;
}

这样 sum(1.2, 3) 的结果就是 4.2 了。

一些注意事项:

  • 联合类型也可用于类成员变量;

  • null 可以用于联合类型中,但不能单独作为类型。比如 int|null 允许,但 null 作为类型不允许;

  • 下面的函数是合法的:

function index(): int|false{
return false;
}
  • 但返回值改为:int|true 却是非法的。这是出于历史原因,很多内部函数在失败时返回了 false 而不是 null。这类函数的典型例子是 strpos()。因此允许联合类型中使用 false,但不允许使用 true。注意 false 并非是类型,这里看出是伪类型,不能单独使用。

还有其他一些细节点,详情请访问官方文档查看:https://www.php.net/manual/zh/language.types.declarations.php。

当然,你完全可以忽略联合类型,继续使用 5.x 的方式写 PHP。

02 Named Arguments(命名参数)

这个特性还是很棒的。这样一来,PHP 的函数支持不定参数、参数默认值、命名参数等。

比如 htmlspecialchars 函数签名如下:

 

htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] ) : string

PHP 8 之前,如果想要最后一个参数传递 false,需要这么调用:

 

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

而有了命名参数后(PHP 8),可以这么调用:

 

htmlspecialchars($string, double_encode: false);

简单清晰。

总结一下就是:

  • 仅需指定必需的参数,可跳过可选的参数。

  • 参数是与顺序无关的且具有自记录功能。

命名参数确实带来了不少便利。不过我觉得也有一些要注意的点:

  • 函数参数可能会很多,Python 中很多函数一大堆参数,可维护性可能是一个问题;

  • 原本函数参数名称是不重要的,但命名参数使得参数名称不能随便改,因为调用者可能依赖它了;

03 Match 表达式

实际中我们经常通过 state 来表示各种状态,比如:0-待审核;1-上线;2-下线;3-删除。因为数据库中存的数字,但显示希望是文字说明。这时一般有两种做法:

 

switch ($state) {
  case 0:
    $stateDesc = '待审核';
    break;
  case 1:
    $stateDesc = '上线';
    break;
  case 2:
    $stateDesc = '下线';
    break;
  case 3:
    $stateDesc = '删除';
    break;
}

我个人喜欢通过 map 来实现:

 

$stateMap = [
  0 => '待审核',
  1 => '上线',
  2 => '下线',
  3 => '删除',
];echo $stateMap[$state];

PHP 8 针对这样的场景提供了 match 表达式:

 

echo match($state) {
  0 => '待审核',
  1 => '上线',
  2 => '下线',
  3 => '删除',
};

可见 match 类似于 switch 语句,有如下特点:

  • Match 是一个表达式,因此其结果可以存储在变量中或返回;

  • Match 分支仅支持单行表达式,不需要 break 语句;

  • switch 相当于使用 == 比较,而 Match 使用 === 比较;

  • 如果没匹配到任何项,会抛 UnhandledMatchError 错误;

  • 也支持 default;

更多信息查看官方文档:https://www.php.net/manual/zh/control-structures.match.php。

04 Nullsafe 运算符(Nullsafe operator)

PHP 8 新增的这个特性,我觉得多少有点可选型的意思。

在 PHP 7 中的如下代码:

 

$country =  null;if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

在 PHP 8 中简化为:

 

$country = $session?->user?->getAddress()?->country;

05 构造器属性提升

PHP 8 起构造器的参数可以提升为类的属性。构造器的参数赋值给类属性的行为很普遍,否则无法操作。而构造器提升的功能则为这种场景提供了便利。例如下面的代码:

 

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 的方式:

 

class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

06 字符串与数字的比较更符合逻辑

PHP 8 比较数字字符串(numeric string)时,会按数字进行比较。不是数字字符串时,将数字转化为字符串,按字符串比较。

这一点要注意,之前这样的代码:

 

0 == 'foobar' // true

现在是 false:

 

0 == 'foobar' // fals

更多说明参见这里:https://wiki.php.net/rfc/string_to_number_comparison。

07 注解(attributes)

现在可以用 PHP 原生语法来使用结构化的元数据,而非 PHPDoc 声明。

之前这么写:

 

class PostsController{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */    public function get($id) { /* ... */ }
}

现在这么写:

 

class PostsController{
    #[Route("/api/posts/{id}", methods: ["GET"])]    public function get($id) { /* ... */ }
}

08 即时编译

PHP 8 引入了两个即时编译引擎。Tracing JIT 在两个中更有潜力,它在综合基准测试中显示了三倍的性能, 并在某些长时间运行的程序中显示了 1.5-2 倍的性能改进。典型的应用性能则和 PHP 7.4 不相上下。

官方给了一个性能测试:

图片.png

9 总结

PHP 8 还有很多其他改动,在这里有详细的说明:https://www.php.net/releases/8.0/zh.php。其中新增了 3 个函数实用的函数:str_contains()、str_starts_with() 和 str_ends_with()。

 

这篇关于php8世界上最好的语言新版本特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871409

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou