PHP类成员可见性和继承的说明

时间:2015-07-14 19:26:28

标签: php

请考虑以下代码段:

Class A {

    private $a = 'foo';

    public function F() {
        return $this->a;
    }

}

Class B extends A {

    private $a = 'bar';

}

echo (new B)->F();

结果是foo。嗯,这是一个既成功的例子。但我想知道为什么。如果在父方法F()声明中我使用伪变量$this,则它引用对象上下文。因此,当我调用子继承方法F() $this变量意味着B的当前实例与private $a = 'bar'时,不是吗?

更新 感谢AbraCadaver的回复。 有一种情况对我来说仍然不清楚:如果$this变量在调用F()期间是B的对象,它如何访问父母的私人成员? 我是否理解正确的父方法实现中的$this类似于:

  public function F(B $obj) {
    return $obj->a;
}

因此,解释器会检查父类的属性可见性,如果是私有范围,它会为B $obj <{1}}替换A $obj

1 个答案:

答案 0 :(得分:1)

来自PHP: Visibility

  

成员宣布   protected只能在类本身内部访问   继承和父类。被宣布为私人的成员可能只是   由定义成员的类访问。

在您的示例中,无论对象属于类B,类A都无法访问另一个类的private属性。

此外,如果B具有受保护的属性,则无法覆盖类A属性,因为它是private

您的示例和以下内容都会产生foo

Class A {

    private $a = 'foo';

    public function F() {
        return $this->a;
    }
}

Class B extends A {

    protected $a = 'bar';

    public function F() {
        return parent::F();
    }
}    
echo (new B)->F();

但是,如果班级A也是protected,那么班级B可以覆盖它,而班级A可以访问班级B中的媒体资源

收益率bar

Class A {

    protected $a = 'foo';

    public function F() {
        return $this->a;
    }
}

Class B extends A {

    protected $a = 'bar';

    public function F() {
        return parent::F();
    }
}
echo (new B)->F();