从PHP中的父类访问具有冲突名称的子属性

时间:2011-07-29 17:08:15

标签: php oop class inheritance

当父级和子级共享相同的属性名称但具有不同的可见性时,是否可以从父类访问子属性?

考虑以下示例:

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的价值?

1 个答案:

答案 0 :(得分:3)

通常情况下,你不能。您必须声明A::$n protectedpublic,因为私人成员始终具有优先权。如果您声明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