Написание 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 изменение области видимости «вне класса»?
Вы вызываете статический метод черты напрямую. Никогда не хорошая идея.
Вы не должны использовать имена признаков нигде, кроме как в 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();
Если вы используете черты, не рассматривайте их как статические классы. Не использовать
function a2() { return T1::a1(); }
но просто используйте:
function a2() { return $this->a1(); }
Если вы называете их так, как будто они являются статической функциональностью класса $this
становится бессмысленным ключевым словом и a1()
не будет понятия, что вы пытаетесь сделать, когда вы нажмете $this->var