当前位置:首页 > php > PHP8新特性系列:构造器属性提升使用及注意事项

PHP8新特性系列:构造器属性提升使用及注意事项

转载自:ThinkPHP官方博客 2021-01-11 php 304
分享给朋友:

本篇主要说下PHP8构造器属性提升的用法,这个特性对于一些需要在构造器中设置或初始化一些类属性的时候非常有用(包括public、protected和private),比如在PHP7中你可以这样定义一个类的属性,然后在构造方法中传值。

class Point {
    public int $x;
    private string $y;

    public function __construct(int $x = 0, string $y='') {
        $this->x = $x;
        $this->y = $y;
    }
}

在PHP8中则可以简化为直接在构造函数方法里面定义类的属性

class Point {
    public function __construct(public int $x = 0, private string $y = '') {
        // 你可以在构造器中直接输出类的x和y属性的值(也就是传入的x和y变量的值)
        var_dump($this->x); 
        var_dump($this->y); 
    }
}

不过需要注意的是构造器属性只能在构造器方法中定义(好像是废话),而且必须添加public/protected/private,如果不添加的话是不会作为类属性定义的,除非你在父类中已经定义了构造器属性,比如:

class Test {
    public function __construct(
        public int $x = 0
    ) {}}class Child extends Test {
    public function __construct(
        $x, 
        public int $y = 0,
        public int $z = 0,
    ) {
        parent::__construct($x);
    }
}

在实际使用过程中,还有些细节需要注意。

抽象类或接口的构造器方法不能使用构造器属性定义

abstract class Test {
    // 错误
    abstract public function __construct(private $x);}
 interface Test {
    // 错误
    public function __construct(private $x);
}

但Traits中是允许使用的

trait MyTrait{
    public function __construct(
        public string $a,
    ) {}
}

对象类型的构造器属性不能使用null作为默认值

如果你的构造器属性的类型是一个对象,那么不可以使用null作为参数默认值

class Test {
    // 错误
    public function __construct(public Type $prop = null) {}
}

但可以使用

class Test {
    // 正确
    public function __construct(public ?Type $prop = null) {}
}

不支持callable类型的构造器属性定义

class Test {
    // 错误
    public function __construct(public callable $callback) {}
}

构造器属性不能使用var定义

class Test {
    // 错误
    public function __construct(var $prop) {}
}

构造器属性定义也不能使用可变参数

class Test {
    // Error: Variadic parameter.
    public function __construct(public string ...$strings) {}
}

构造器属性和类属性不能重复定义

比如

class Test {
    public string $prop;
    public int $explicitProp;

    // Error: Redeclaration of property.
    public function __construct(public string $prop) {}
}

但你可以使用构造器属性定义额外的尚未定义过的类属性

class Test {
    public string $prop;
    public int $explicitProp;

    // Correct
    public function __construct(public int $promotedProp, int $arg) {
        $this->explicitProp = $arg;
    }
}

只能使用简单默认值

比如,你不可以在参数的默认值中使用函数或者实例化对象。

public function __construct(
    public string $name = 'Brent',
    // 错误
    public DateTime $date = new DateTime(),
) {}

更多的用法可以自行研究。

分享给朋友:

相关文章

在PHP7+下监控Memcached服务、性能、扇区等信息

PHPMemcachedAdmin:一款网页可视化的Memcached工具

Swoole的PHP协程开发框架 imi 集成ThinkPHP模板引擎 think-template

在 imi 框架根目录中执行composer require topthink/think-template安装好模板引擎后,找到路径\vendor\topthink\think-template\src\Template.php找到 fetch() 渲染模板文件的方法,将最后一

PHP7下MongoDB自增或自减一个字段的值

findAndModify属于原子操作模型数据,所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。

PHP的面向对象解析

早期编程由于受电脑硬件限制,程序都是追求效率,而忽略可理解性,扩充性,随着硬件技术的发展,编程越来越重视多人开发,程序员越来越重视程序的可靠性,可扩展性,可维护性,所以刺激了程序语言的发展

ThinkPHP6.0使用EasyTask常驻内存多进程任务管理

PHP常驻内存的多进程任务管理器Composer包。以进程管理为出发点,同时也支持为每个进程设置定时执行功能,您可以用它来完成需要重复运行的任务(如订单超时自动取消,短信邮件异步推送,队列/消费者/频道订阅者等等),甚至处理计划任务。

PHP8新特性盘点

PHP 8.0.0 已经正式发布了,这个对于PHPer无疑是一个令人振奋的消息。它包含了很多新功能与优化项, 包括命名参数、联合类型、注解、构造器属性提升、match表达式、nullsafe运算符、JIT,并改进了类型系统、错误处理、语法一致性。

ThinkPHP6.0在PHP8下报错解决方法

PHP8下全新安装ThinkPHP6.0.X出现报错,如下Deprecated: Method ReflectionParameter::getClass() is deprecated in xxxx\vendor\topthink\fr

MongoDB驱动聚合查询aggregate在分组分页排序后出现的数据混乱问题

最近在获取MongoDB数据时需要把重复的数据分组来排序,语言版本:PHP7

PHP依赖管理工具composer 2.0正式发布

composer 2.0 现在已更新!性能改进说明(英文)https://blog.packagist.com/composer-2-0-is-now-available/1.有什么新功能?对于命令行(CLI)用户新的平台检查功能检查运行时 PHP 版本和可用扩展,以确保它们与项目依赖项匹配。

2020年度最受欢迎中国开源软件评选【投Thinkphp一票否】

评选活动分为「最佳人气项目」、「优秀 Gitee 组织」及「最积极运营项目」等子类,本页面用于投票选出「最佳人气项目」;