Невозможно получить доступ к защищенному свойству в признаке

Написание PHP. После некоторой отладки я сократил свое замечательное поведение до этого кода:

trait T1 {
function a1() { return $this->var; }
}
trait T2 {
use T1;
function a2() { return T1::a1(); }
}
class A {
use T2;
protected $var = 3;
}

$a = new A;
echo $a->a2();

Этот код работает до тех пор, пока long $ var в классе A определен как public; поскольку я хочу, чтобы это было защищено (просто чтобы было приятно), я наткнулся на ошибку Неустранимая ошибка: невозможно получить доступ к защищенному свойству B :: $ var in … в строке 5

Почему это происходит в этом случае? Делает ли T1 :: a1 изменение области видимости «вне класса»?

3

Решение

Вы вызываете статический метод черты напрямую. Никогда не хорошая идея.

Вы не должны использовать имена признаков нигде, кроме как в use утверждение в классе.

Если вы позвоните a1() как метод $thisработает нормально: http://3v4l.org/TNcVA

trait T1 {
function a1() {
return $this->var;
}
}
trait T2 {
use T1;
function a2() {
return $this->a1();
}
}
class A {
use T2;
protected $var = 3;
}

$a = new A;
echo $a->a2();
5

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

Если вы используете черты, не рассматривайте их как статические классы. Не использовать

function a2() { return T1::a1(); }

но просто используйте:

function a2() { return $this->a1(); }

Если вы называете их так, как будто они являются статической функциональностью класса $this становится бессмысленным ключевым словом и a1() не будет понятия, что вы пытаетесь сделать, когда вы нажмете $this->var

1

По вопросам рекламы [email protected]