PHP 8 发布啦!!
PHP于2020年11月26日发布了新版本。PHP是一个递归缩写,类似于GNU,代表PHP:超文本预处理器(Hypertext Preprocessor)。它是Web开发领域最常用的后端语言之一。尽管现在出现了NodeJS、Django、Flask、Laravel、Drupal等新的Web开发框架,但PHP仍然是后端市场的主要参与者。PHP是一种通用脚本语言,尤其适用于Web开发。它最初由丹麦裔加拿大程序员Rasmus Lerdorf于1994年创建。
PHP开发团队对其新版本声明如下:
“PHP 8.0 是 PHP 语言的一次重大更新。
它包含许多新特性和优化,包括命名参数、联合类型、属性、构造函数属性提升、匹配表达式、空安全运算符、JIT,以及类型系统、错误处理和一致性方面的改进。”
新版本的主要变化包括:
- 命名参数
- 属性
- 建筑商房地产推广
- 联合类型
- 匹配表达式
- 空安全运算符
- 内部函数的一致性类型错误
- 新型 JIT 编译引擎
以下列出部分变更的详情。
命名参数
仅指定必需参数,省略可选参数。
参数顺序无关,且参数本身已明确说明。
// PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
// PHP 8
htmlspecialchars($string, double_encode: false);
属性
现在,您可以使用 PHP 的原生语法来编写结构化元数据,而无需使用 PHPDoc 注解。
// 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) { /* ... */ }
}
建筑商房地产推广
减少定义和初始化属性所需的样板代码。
//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,
) {}
}
联合类型
您可以使用在运行时进行验证的原生联合类型声明,而不是使用 PHPDoc 注解来表示类型组合。
//PHP 7
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}
new Number('NaN'); // Ok
//PHP 8
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
匹配表达式
新比赛模式与 Switch 类似,具有以下特点:
- Match 是一个表达式,这意味着它的结果可以存储在变量中或返回给变量。
- 匹配分支仅支持单行表达式,不需要 break; 语句。
- Match 会进行严格的比较。
// 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
空安全运算符
现在,您可以使用带有新空安全运算符的调用链来代替空值检查条件。当链中某个元素的求值失败时,整个链的执行将中止,并且整个链的求值结果为空。
// 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;
更合理的字符串到数字比较
当与数字字符串进行比较时,PHP 8 使用数字比较。否则,它会将数字转换为字符串,然后使用字符串比较。
// PHP 7
0 == 'foobar' // true
// PHP 8
0 == 'foobar' // false
以下是一些变更内容,要了解所有变更,请访问此链接。
文章来源:https://dev.to/amananandrai/php-8-has-released-k51