无法从继承的方法的子类访问私有变量

时间:2019-08-08 04:40:28

标签: php

class Configurable
{
    protected function configure(array $config): void
    {
        foreach ($config as $key => $value){
             if (property_exists($this, $key)){
                $this->{$key} = $value;
            }
        }
    }
}

class C extends Configurable
{
    private $abc;

    public function __construct()
    {
        $this->configure(['abc' => 5]);
    }
}

$c = new C();

此代码给我错误Cannot access private property C::$abc

parent类中的私有变量很明显时,但是在此代码中,私有变量在子类中,而property_exists看到了该变量。我在php文档中找不到解释。

我的困惑如下。 父方法继承于子方法。我的假设是此方法应该可以访问child中的变量,但没有访问权限。 property_exists知道此属性,但无法设置。

1 个答案:

答案 0 :(得分:0)

使用protected $ abc` visibility 的原因是您在同一类中使用父方法(configure()),因此在父类中abc变量不能是private的访问原因

class Configurable
{
    protected function configure(array $config): void
    {
        foreach ($config as $key => $value){
             if (property_exists($this, $key)){
                $this->{$key} = $value;
            }
        }
    }
}

class C extends Configurable
{
    protected $abc;

    public function __construct()
    {
        $this->configure(['abc' => 5]);
    }

    //this method is when you're trying to access $c->abc that'll return from here.
    public function __get($method)
    {
        return $this->$method;
    }
}

$c = new C();
echo $c->abc;

如果要使用 Private 定义变量,则可以在同一类中定义configure()方法。和 __ get 方法是用于当您尝试访问受保护的 private 变量时,此__get()函数将被调用。

class Configurable
{
    protected function configure(array $config): void
    {
        foreach ($config as $key => $value){
             if (property_exists($this, $key)){
                $this->{$key} = $value;
            }
        }
    }
}

class C extends Configurable
{
    private $abc;

    public function __construct()
    {
        $this->configure(['abc' => 5]);
    }

    //method overriding
    protected function configure(array $config): void
    {
        foreach ($config as $key => $value){
             if (property_exists($this, $key)){
                $this->{$key} = $value;
            }
        }
    }

    public function __get($method)
    {
        return $this->$method;
    }
}

$c = new C();

echo $c->abc;