75142913在线留言
PHP 8.x 的一些新特性_PHP技术_网络人

PHP 8.x 的一些新特性

Kwok 发表于:2022-05-26 11:26:54 点击:82 评论: 0

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 语句相似,但是有以下关键区别:

  • match 比较分支值,使用了严格比较 (===), 而 switch 语句使用了松散比较。
  • match 表达式会返回一个值。
  • match 的分支不会像 switch 语句一样, 落空时执行下个 case。
  • match 表达式必须彻底列举所有情况。 
$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 => '未匹配呀~',
};

还有更多用法可以参考手册,我感觉还是很好用的。。。

五、空变量运算符(Nullsafe)

早些时候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
标签:php8Kwok最后编辑于:2022-05-26 12:26:03
0
感谢打赏!

《PHP 8.x 的一些新特性》的网友评论(0)

本站推荐阅读

热门点击文章