当父类和子类共享相同的属性名称但具有不同的可见性时,是否可以从父类访问子属性?
考虑以下示例:
abstract class A {
private $n = 1;
public function getN() {
return $this->n;
}
}
class B extends A {
protected $n = 2;
}
$b = new B;
echo $b->getN(); // returns 1
getN()
返回1
,因为它返回的是自己私有(private)的$n
的值。
是否有可能从父代获取子代 protected $n
的值?
最佳答案
通常情况下,您不能。您必须声明 A::$n
protected
或 public
,因为私有(private)成员始终具有优先权。如果您将 A::$n
声明为 public,则 B::$n
也需要是 public,因为您无法覆盖可见性低于其父级的属性。您只能使用 Reflection API 来做到这一点:
abstract class A {
private $n = 1;
public function getN() {
$ref = new ReflectionProperty($this, 'n');
$ref->setAccessible(true);
echo $ref->getValue($this);
}
}
class B extends A {
protected $n = 2;
}
$b = new B;
echo $b->getN(); // 2
关于php - 从 PHP 中的父类访问具有冲突名称的子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876590/