2014-10-29 2 views
0

Написание некоторых 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(); 

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

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

+0

«Я хочу, чтобы это защищалось (просто чтобы было приятно)» lol! – foxygen

+0

Тот же результат, если вы вернете $ this-> a1(); 'в' a2() 'в' T2'? – Rudie

+0

Извините, где вы строите '$ b' в этом коде? (либо исправить свой код, чтобы сделать этот $ a, который, как я предполагаю, вы хотели сделать, или ввести объявление и инициализацию $ b) –

ответ

2

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

Вы не должны использовать имена признаков в любом месте, кроме инструкции 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(); 
+0

Хорошо, никогда не бывало хорошей идеей, но это будет приятно услышать какое-то объяснение по поводу того, почему – Yang

+1

PHP docs говорят: черты - это механизм copy'n'paste для создания классов. Вне компилятора их не существует. Вы не можете определить, откуда пришли методы, какие черты были загружены и т. Д. Они просто используются для построения класса. Вот почему вы не должны использовать их нигде. – Rudie

1

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

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

а просто использовать:

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

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

Смежные вопросы