写点什么

PHP 8.0 正式发布:支持 JIT 编译器,性能提升高达 3 倍

  • 2020 年 11 月 27 日
  • 本文字数:3164 字

    阅读完需:约 10 分钟

PHP 8.0正式发布:支持JIT编译器,性能提升高达3倍

美国时间 11 月 26 日,PHP 团队宣布 PHP 8.0 正式 GA。PHP 8.0 是 PHP 语言的最新主要版本,带来了许多新特性和优化,包括命名参数(named arguments)、联合类型(union types)、属性(attributes)、构造器属性提升(constructor property promotion)、Match 表达式、nullsafe 运算符、JIT,以及针对类型系统、错误处理和一致性的诸多改进。

 


PHP 8.0.0 下载地址:


https://www.php.net/downloads


下文将对新版本的重要亮点做简单介绍:

命名参数


https://wiki.php.net/rfc/named_params


PHP 7


htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
复制代码


PHP 8


htmlspecialchars($string, double_encode: false);
复制代码


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

  • 参数与顺序无关,且是自描述的。

属性


现在,开发者可以使用基于 PHP 原生语法的结构化元数据来代替 PHPDoc 注解。


https://wiki.php.net/rfc/attributes_v2


PHP 7


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


PHP 8


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


构造器属性提升


新版本定义和初始化属性所用的样板代码更少。


https://wiki.php.net/rfc/constructor_promotion


PHP 7


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, ) {}}
复制代码

联合类型(Union Types)


Union Types 支持接收多个不同类型的值,而不是单个类型。目前 PHP 已经支持两种特殊的联合类型:


  • Type 或 null,使用特殊?Type 语法。

  • array 或 Traversable,使用特殊 iterable 类型。


对于类型组合,可以使用在运行时经过验证的原生联合类型声明来代替 PHPDoc 注解。


https://wiki.php.net/rfc/union_types_v2


支持联合类型之后,将会允许将更多类型信息从 phpdoc 迁移至函数签名。可以说,泛型之后,联合类型是目前类型声明系统中最大的突破口。


PHP 7


class Number {  /** @var int|float */  private $number;

/** * @param float|int $number */ public function __construct($number) { $this->number = $number; }}

new Number('NaN'); // O
复制代码


PHP 8


class Number {  public function __construct(   private int|float $number  ) {}}

new Number('NaN'); // TypeError
复制代码

Match 表达式

新的 match 很像 switch,并具有以下特性:

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

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

  • Match 执行严格比较。


https://wiki.php.net/rfc/match_expression_v2


PHP 7


switch (8.0) {  case '8.0':   $result = "Oh no!";   break;  case 8.0:   $result = "This is what I expected";   break;}echo $result;//> Oh no!
复制代码


PHP 8


echo match (8.0) {  '8.0' => "Oh no!",  8.0 => "This is what I expected",};//> This is what I expected
复制代码


Nullsafe 运算符


现在,开发者可以使用带有新的 nullsafe 运算符的调用链来代替 null check。当对链中一个元素的求值失败时,整个链的执行将中止,并且整个链的求值为 null。


https://wiki.php.net/rfc/nullsafe_operator


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;
复制代码


字符串与数字的判断更合理


使用==和其他非严格比较运算符对字符串和数字之间做比较时,原本的做法是将字符串强制转换为数字,然后对整数或浮点数进行比较。这会导致许多令人惊讶的比较结果,其中最值得注意的是 0 == "foobar" 返回 true。


在新版本中,仅在字符串实际为数字时才使用数字比较,否则将数字转换为字符串,并执行字符串比较。


https://wiki.php.net/rfc/string_to_number_comparison


PHP 7


0 == 'foobar' // true
复制代码


PHP 8


0 == 'foobar' // false
复制代码


内部函数的类型错误一致


在新版本中,如果参数验证失败,大多数内部函数将抛出 Error 异常。


https://wiki.php.net/rfc/consistent_type_errors


PHP 7


strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
复制代码


PHP 8


strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
复制代码


JIT 编译


PHP 8 引入了两个 JIT 编译引擎。Tracing JIT 的表现最出色,它在综合基准测试中的性能提高到大约 3 倍,在某些特定的传统应用程序中提高到 1.5–2 倍。典型的应用程序性能与 PHP 7.4 相当。


JIT 对 PHP 8 性能的贡献



类型系统和错误处理方面的改进



其他语法调整和改进


新的类、接口和函数


下载


要下载 PHP 8 的源代码,请访问下载页面(https://www.php.net/downloads)。Windows 二进制文件位于 Windows 版 PHP 网站(http://windows.php.net/download)。更改列表位于 ChangeLog(http://www.php.net/ChangeLog-8.php)。


PHP 手册中提供了迁移指南(https://www.php.net/manual/en/migration80.php)。请查阅它以获取新特性细节和向后不兼容更改的详细列表。


原文链接:https://www.php.net/releases/8.0/en.php

2020 年 11 月 27 日 15:212551

评论

发布
暂无评论
发现更多内容

构建一套适合微服务的高可用架构

环信

树莓派上的家庭监控中心

冯骐

运维 树莓派 监控系统 Open-Falcon 物联网,

GaussDB(DWS):非侵入式备份及其在NBU上的应用

华为云开发者联盟

架构 GaussDB 集群 备份 NBU

元宵节元宵钱,不买元宵买云资源! | 2核4G低至0.79元/天

京东科技开发者

云主机 云服务器 云存储 云硬盘

MongoDB 在评论中台的实践

vivo互联网技术

数据库 mongodb 分布式 集群

工作两三年了,整不明白架构图都画啥?

小傅哥

Java 后端 小傅哥 架构设计 画架构图

Wiki.js 配置 LDAP 认证

东风微鸣

wiki

LeetCode题解:123. 买卖股票的最佳时机 III,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

EEPROM CAT24CXX实现分页读、写数据

不脱发的程序猿

28天写作 CAT24C08 EEPROM 嵌入式软件 单片机

海豚调度dolphinscheduler SQL脚本初始化流程

cloudcoder

海豚调度 调度引擎 分布式任务调度

看完你就明白什么是图神经网络

华为云开发者联盟

神经网络 深度学习 节点 图神经网络 图结构

QA视角看数据匿名化

BY林子

数据安全 测试右移 用户数据 数据脱敏

更新啦!第 59 期《HelloGitHub》开源月刊

HelloGitHub

GitHub 开源

华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易

华为云开发者联盟

数据库 云原生 华为云 GaussDB 数仓

程序员专属“灯谜”大挑战,答对六题算你赢!

京东科技开发者

编程语言 集群

Elasticsearch Fetch Phase

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

程序员之禅(一)

每天读本书

读书笔记

技术案例 | 云原生微服务落地难?百度自用CRM这样做

百度开发者中心

微服务 CRM #百度智能云#

OS命令--shell中数组的操作

cloudcoder

数组 Shell 循环引用

国产芯片WiFi物联网智能插座—电耗采集功能设计

不脱发的程序猿

28天写作 国产芯片 电耗检测 电压电流 华大MCU

搭建一个 802.1x 的 web 测试服务

冯骐

网络 监控系统 Open-Falcon radius eduroam

MySQL字段默认值设置详解

Simon

MySQL 数据库

android程序开发!2021Android精选面试实战总结整理,大厂直通车!

欢喜学安卓

android 程序员 面试 移动开发

华为云举办AI经典论文复现活动,打造领先AI开发者学习社区

华为云开发者联盟

AI 华为云 modelarts 论文 AI Gallery

Node集群思考以及cluster包初探

鲍师傅的铜锣烧

后台开发 Node

Linux入门篇 —— Linux 磁盘管理之磁盘理论篇

若尘

Linux linux编程 磁盘

刷屏洗脑的“吗咿呀嘿”,到底是个啥?

架构精进之路

商业模式 28天写作 3月日更

树莓派上的温湿度环境监控

冯骐

运维 树莓派 物联网 监控告警

使用 pyVmomi 采集 vSphere 监控指标

冯骐

Python 运维 监控 Open-Falcon vpshere

山东青岛推进平安小区建设!源中瑞智慧社区平台解决方案

源中瑞-龙先生

解决方案 山东 源中瑞 青岛 智慧社区

android布局优化!Android屏幕适配很难嘛?其实也就那么回事,内含福利

欢喜学安卓

android 程序员 面试 移动开发

PHP 8.0正式发布:支持JIT编译器,性能提升高达3倍_编程语言_蔡芳芳_InfoQ精选文章