如果我使用构造函数属性提升,我可以自动调用构造函数。我不需要写
parent::_constructor()
。但子类可以访问私有属性。这是一个错误,只要不使用适当的促销就可以解决。我是不是搞错了什么?
class Parent {
public function __construct(
protected $protected,
private $private
) {
}
}
class Child extends Parent {
public function __construct(
protected $protected,
private $private
) {
}
function myFunc() {
echo $this->private; // This works!!
}
}
构造函数属性提升只是意味着“同时声明属性和构造函数参数”。它不会改变继承和私有属性的工作方式。
您的代码相当于:
class Parent {
protected $protected;
private $private;
public function __construct(
$protected,
$private
) {
$this->protected = $protected;
$this->private = $private;
}
}
class Child extends Parent {
protected $protected;
private $private;
public function __construct(
$protected,
$private
) {
$this->protected = $protected;
$this->private = $private;
}
function myFunc() {
echo $this->private; // This works!!
}
}
子类永远不会触及父类的私有属性,它只是声明自己的私有属性,并且恰好具有相同的名称。如果您尝试在
$this->private
中定义的方法中回显 Parent
,您会发现它未初始化:您没有运行 Parent
构造函数,因此没有写入任何内容。