【发布时间】:2015-07-14 19:26:27
【问题描述】:
考虑以下 sn-p:
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的成员只能在类本身内以及被继承类和父类访问。 声明为私有的成员只能被访问由定义成员的类。 php.net/manual/en/language.oop5.visibility.php -
问题不是关于使用
protected。问题是为什么 php 会忽略子类中定义的private变量。 -
@u_mulder:因为子类不能覆盖私有属性。所以是的,如果你想让它工作,它就是受保护的。
-
@u_mulder
ignores private variable defined in a child class?F()是公开的,所以 B 类可以调用它。F()只是返回它的类的私有成员的值。 -
@AbraCadaver 我阅读了您的回答并对它感到满意,谢谢)
标签: php