gpt4 book ai didi

php - PHP类成员可见性和继承的解释

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:15 24 4
gpt4 key购买 nike

考虑以下片段:

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的一个对象,它如何访问父类的私有(private)成员?我是否正确理解父方法实现中的 $this 类似于:

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

所以解释器检查父类的属性可见性,如果是私有(private)范围,它用 B $obj 代替 A $obj

最佳答案

来自 PHP: Visibility :

Members declared protected can be accessed only within the class itself and by inherited and parent classes. Members declared as private may only be accessed by the class that defines the member.

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

此外,如果 B有一个 protected 属性,不能覆盖类 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();

关于php - PHP类成员可见性和继承的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31415588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com