本文主要讲PHP8构造函数属性提升的用法。当需要在构造函数中设置或初始化某些类属性(包括public、protected、private)时,这个特性非常有用,比如在PHP7中可以这样定义一个类的属性,然后将值传入构造函数。类Point{publicint$x;私有字符串$y;公共函数__construct(int$x=0,string$y=''){$this->x=$x;$this->y=$y;}}在PHP8中,可以简化为直接在构造方法中定义类的属性classPoint{publicfunction__construct(publicint$x=0,privatestring$y=''){//可以直接在构造函数输出类的x和y属性的值(即传入的x和y变量的值)var_dump($this->x);var_dump($this->y);}}不过需要注意的是constructor属性只能在constructor方法中定义(好像是废话),而且public/protected/private是一定要加的,不加的话就不会定义成aclass属性,除非你在父类中定义了constructor属性,比如:y=0,publicint$z=0,){parent::__construct($x);}}在实际使用中,还是有一些细节需要注意的。抽象类或接口的构造方法不能使用构造函数属性定义允许使用traitMyTrait{publicfunction__construct(publicstring$a,){}}对象类型的constructor属性不能使用null作为默认值如果你的constructor属性的类型是对象,那么就不能使用null作为参数默认classTest{//错误的publicfunction__construct(publicType$prop=null){}}但可以使用classTest{//正确的publicfunction__construct(public?Type$prop=null){}}不支持可调用类型的构造函数属性定义classTest{//错误publicfunction__construct(publiccallable$callback){}}构造函数属性不能使用var定义classTest{//错误publicfunction__construct(var$prop){}}构造可变参数erclassTest{//错误:可变参数。publicfunction__construct(publicstring...$strings){}}构造函数属性和类属性不能重复定义,如classTest{publicstring$prop;公共诠释$explicitProp;//错误:重新声明属性。公共职能__construct(publicstring$prop){}}但您可以使用构造函数属性来定义其他未定义的类属性classTest{publicstring$prop;公共诠释$explicitProp;//正确的公共函数__construct(publicint$promotedProp,int$arg){$this->explicitProp=$arg;}}只能使用简单的默认值。例如不能在参数默认值中使用函数或实例化对象publicfunction__construct(publicstring$name='Brent',//ErrorpublicDateTime$date=newDateTime(),){}更多用法可以研究由你自己。
