PHP magic __get не работает для переменной в абстрактном базовом классе

В моем проекте я часто использую наследование классов.
Теперь я заметил, что мой магический метод не срабатывает, когда я хочу получить доступ к переменной в базовом классе.
Отсюда следующий код:

abstract class A
{
protected $varA;

final public function __get($var)
{
echo $var;
}
}

class B extends A
{
protected $varB;
}

class C extends A
{
public function test()
{
$test = new B();
$test->varB; // Get output
$test->varA; // No output
}
}

$test = new C();
$test->test();

-1

Решение

Теперь я вижу, что вы столкнулись с функцией PHP. Видимость свойств зависит от классов, но не от объектов.

Объекты одного типа будут иметь доступ друг к другу как частные, так и
защищенные члены, даже если они не совпадают. Это
потому что конкретные детали реализации уже известны, когда
внутри этих объектов.

http://php.net/manual/en/language.oop5.visibility.php#example-208

4

Другие решения

__get срабатывает только если свойство не существует.

varA — это свойство вашего объекта. Проблема в том, что она защищена. таким образом, не доступны извне вашего класса.

0

Из класса CHILD доступен защищенный вар. Дочерний класс видит varA, но varA равен null

0

$ varA является защищенной переменной класса A.

Класс б & C являются расширениями класса A.

Таким образом, $ varA существует в экземпляре C или B, потому что защищенные переменные доступны и присваиваются в потомках класса, в котором они определены. Вот для чего они.

Поскольку $ varA существует, __get не запускается.

Я не уверен, что вы ожидаете быть другим?

0