当父级和子级共享相同的属性名称但具有不同的可见性时,是否可以从父类访问子属性?
考虑以下示例:
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
,因为它会返回自己的私有$n
的值。
是否有可能从父母那里获得孩子的 protected $n
的价值?
答案 0 :(得分:3)
通常情况下,你不能。您必须声明A::$n
protected
或public
,因为私人成员始终具有优先权。如果您声明A::$n
公开,则B::$n
也需要公开,因为您无法覆盖可见度低于其父级的属性。您只能使用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