PHP - 构造函数属性提升对私有变量的访问

问题描述 投票:0回答:1

如果我使用构造函数属性提升,我可以自动调用构造函数。我不需要写

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!!
    }
}
php oop
1个回答
0
投票

构造函数属性提升只是意味着“同时声明属性和构造函数参数”。它不会改变继承和私有属性的工作方式。

您的代码相当于:

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
构造函数,因此没有写入任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.