请考虑以下代码段:
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
答案 0 :(得分:1)
成员宣布 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();