php8的新特性(一) 主要新特性


php8的主要新特性

命名参数

定义

声明$中的参数名称不带符号将是参数名称,或函数形参的名字取$后变为实参的命名函数

格式:name:"nickname"name:$name

示例

function info($nickname, $avatar)
{
    var_dump("昵称为{$nickname}、头像为{$avatar}的用户");
}

info(avatar:'avatar',nickname:'nickname');

可变参数下的应用

function info ($nickname,$avatar, ...$args):void
{
    var_dump($args);
}
info('nickname','avatar',age:8,sex:'man');
// array(2) { ["age"]=> int(8) ["sex"]=> string(3) "man" }

注解

语法

#[Name]
#[Name1,Name2]
#[Name(Arguments)]
#[Name(Argunment1,Arguments2,ArgumentN)]
#[Name1(Argument),Name2(Argument),Name3(Argument)]
function show($name):void{}

示例

#[arg1]
#[arg2,arg3]
#[api('123')]
#[info('name','headimg')]
#[junp('跳'),run('跑')]
function show2($name):void{}

$docRef = new ReflectionFunction('show2');
$docAttr = $docRef->getAttributes();
foreach ($docAttr as $attrItem){
    var_dump($attrItem->getName());
    var_dump($attrItem->getArguments());
}
/**
 * 打印结果:
 * string(4) "arg1"
 * array(0) {
 * }
 * 
 * string(4) "arg2"
 * array(0) {
 * }
 * 
 * string(4) "arg3"
 * array(0) {
 * }
 * 
 * string(3) "api"
 * array(1) {
 * [0]=>
 * string(3) "123"
 * }
 * 
 * string(4) "info"
 * array(2) {
 * [0]=>
 * string(4) "name"
 * [1]=>
 * string(7) "headimg"
 * }
 * 
 * string(4) "junp"
 * array(1) {
 * [0]=>
 * string(3) "跳"
 * }
 * 
 * string(3) "run"
 * array(1) {
 * [0]=>
 * string(3) "跑"
 * }
 */

注解类的使用

个人理解,使用注解可以将类定义成一个个低耦合、高内聚的元数据类,灵活的注入方法或者类里,通过反射注解类示例达到调用的目的

注解类的使用示例

#[Attribute]
class initData
{
    public function __construct(private string $data)
    {
    }

    public function show()
    {
        return $this->data;
    }
}

#[initData('123')]
class serviceData{}

$classRef = new ReflectionClass('serviceData');
$classAttr = $classRef->getAttributes('initData')[0];
$docClassObj = $classAttr->newInstance();

var_dump($docClassObj->show()); // 123

构造器属性提升

定义

构造器属性提升是php8的一个新语法,允许从构造函数直接进行类属性声明和构造函数赋值。

示例

// 旧代码
class User
{
    public string $name;
    public function __construct(string $name) {
        $this->name = $name;
    }
}

// 新代码
class User
{
    public function __construct(public string $name) {}
}

联合类型

低版本只能为属性、参数和返回类型声明单个类型。

属性

class Person{
    public string $name;
    public function __construct(public string|array $name){
        var_dump($this->name);
    }
}
new Person([]);

参数

function show(int|string $a){
    var_dump($a);
}
show('123');

返回类型

function show(int|string $a):int|string{
    var_dump($a);

    return 5;
}

echo show('123');

Nullsafe空安全运算符

这个特性就很棒了

示例

// 旧版本用if判断,if地狱
if($session!==null){
    $user = $session->user;

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

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

            if($country!==null){
                var_dump($country);
            }
        }
    }
}

// 新版本
echo $session?->user?->getAddress()?->country

Match表达式

感觉和switch差不多,但是执行严格匹配(===),然后匹配不到就会抛出错误 UnhandledMatchError

示例

$key = 'b';
$str = match($key) {
    'a' => 'this a',
    'c' => 'this c',
     0  => 'this 0',
    'b' => 'last b',
};
echo $str;//输出 last b

参考资料:PHP8新特性技术详解2021版


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
php8的新特性(二) JIT php8的新特性(二) JIT
JIT原理 Zend Opcache流程 检查opcodes是否缓存 zend compiler编译器进行编译生成opcodes optimizer优化器生成优化后的opcodes 把优化后的opcodes放入opcodes cache缓存
下一篇 
消息队列之RabbitMQ(二) Laravel中使用rabbitmq 消息队列之RabbitMQ(二) Laravel中使用rabbitmq
消息队列之RabbitMQ(二) Laravel中使用rabbitmq简介博主在之前的文章大致介绍了下 rabbitmq 的原理、应用场景。接下来讲下如何在 laravel5.5 中去使用。 安装rabbitmq在本地进行测试的时候,使用
  目录