Доступ к дочернему свойству с конфликтующим именем из родительского класса в PHP - PullRequest
3 голосов
/ 29 июля 2011

Можно ли получить доступ к дочернему свойству из родительского класса, когда оба родительских и дочерних объекта имеют одно и то же имя свойства, но с разной видимостью?

Рассмотрим следующий пример:

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.

Возможно ли вместо этого получить значение child's protected $n,от родителя?

1 Ответ

3 голосов
/ 29 июля 2011

Обычно вы не можете. Вы должны будете объявить A::$n protected или public, потому что частные члены всегда имеют приоритет. Если вы объявите A::$n public, тогда 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...