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(),
) {}
更多的用法可以自行研究。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录