考虑以下代码片段:
Class A {
private $a = 'foo';
public function F() {
return $this->a;
}
}
Class B extends A {
private $a = 'bar';
}
echo (new B)->F();
结果是
foo
。php以这种方式工作已成定局,但我想知道为什么。如果在父类方法F()
的声明中使用伪变量$this
,它将引用对象上下文。因此,当我调用子类继承的方法F()
时,$this
变量表示B
的当前实例,其中包含private $a = 'bar'
,对吗?更新 感谢AbraCadaver的回复。 还有一个情况我不太清楚:如果
$this
变量在调用F()
时是B的一个对象,那么它如何访问父类的私有成员?
我理解正确吗,父类方法实现中的$this
类似于: public function F(B $obj) {
return $obj->a;
}
因此,解释器从父类检查属性的可见性,在私有范围的情况下,将B $obj
替换为A $obj
protected
: 声明为 protected 的成员只能在类内部以及继承和父类中访问。 声明为 private 的成员只能被定义该成员的类访问。 http://php.net/manual/en/language.oop5.visibility.php - AbraCadaverprotected
。问题在于为什么PHP会忽略子类中定义的private
变量。 - u_mulderF()
是公共的,所以B类可以调用它。F()
仅仅返回其所属类的私有成员的值。 - MonkeyZeus