PHP 8.x 已发布了,最新的Laravel对PHP版本最低要求也需要php8的支持,HP 8.0 是 PHP 语言的一个主版本更新。 它包含了很多新功能与优化项, 包括命名参数、联合类型、注解、构造器属性提升、match 表达式、nullsafe 运算符、JIT,并改进了类型系统、错误处理、语法一致性。
下面针对一些我们会常见、常用的php8新特性做介绍,以提升我们的开发速度,减少代码量。
PHP 8更像是强类型语言,类似swift,现在可以直接使用参数命名,在以前版本中,我们必须按顺序一个一个的写参数。现在可以跳过没有必须的参数了:
//PHP 7 需要按顺序写完整的参数
htmlspecialchars("55mx.com", ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
//PHP 8 可跳过参数,直接使用命名
htmlspecialchars("55mx.com", double_encode: false);
那么我们自定义的函数在定义的时候也可以这样操作:
//定义函数
function sun(string $a, int $b = 0, int $x = 0)
{
echo $a . ($b + $x);
}
//php7调用(必须按顺序写参数)
sun("输出:", 3, 7);
//PHP8调用(顺序神马的无所谓呢)
sun(x: 3, b: 7, a: "输出:");
通常情况下我们使用下面的方式来定义类所需要的属性:
class Student
{
public string $name;
public int $age;
public float $score;
public function __construct($name, $age, $score)
{
$this->name = $name; //姓名
$this->age = $age; //年龄
$this->score = $score; //成绩
}
}
而PHP 8 里我们可以简写为下面的代码:
class Student
{
public function __construct(
public string $name,
public int $age,
public float $score
) {
//这里处理一些其它事情吧。。。
}
}
结合上面的参数命名,我们可以这样调用:
$student = new Student(age: 15, name: '张同学', score: 99);
上面学生类里的score我们定义的是一个浮点类型,虽然我们写了99的成绩,但在输出的时候会显示99.0,这时候我们就可以使用联合类型来处理:
public int|float $score //联合类型,限制只能为整数或者浮点数
php8里新增加了一个match 匹配表达式,可用于替代switch的一些操作,语法更简洁,因为不支持再使用break语句:
switch (8.0) {
case '8.0':
$result = "我明明输入的是浮点数,为毛匹配了字符串!";
break;
case 8.0:
$result = "这里为啥不匹配?";
break;
}
echo $result;
使用match 匹配表达式:
echo match (8.0) {
'8.0' => "匹配字符串",
8.0 => "匹配浮点", //正确匹配
};
match 表达式跟 switch 语句相似,但是有以下关键区别:
$a = $b = $c = 'x';
echo match ('x') {
$a => 5,
$b => 5,
$c => 5,
};
//分支简写
echo match ('x') {
$a, $b, $c => 5,
};
未匹配成功处理:
echo match ('1') {
1, 2 => foo(),
3, 4 => bar(),
default => '未匹配呀~',
};
还有更多用法可以参考手册,我感觉还是很好用的。。。
早些时候php推出了 echo $x??'$x未定义';双问号的未定义显示运算符,PHP8在些基础上又推荐了一个单问题运算符用于快速判断运算:
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
echo $country;
可以简写为:
$country = $session?->user?->getAddress()?->country;
现在可以用新的 nullsafe 运算符链式调用,而不需要条件检查 null。 如果链条中的一个元素失败了,整个链条会中止并认定为 Null。
Weak Map 类 弱引用
Stringable 接口
str_contains()、 str_starts_with()、 str_ends_with()
fdiv()
get_debug_type()
get_resource_id()
token_get_all() 对象实现
New DOM Traversal and Manipulation APIs
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/226
《PHP 8.x 的一些新特性》的网友评论(0)