class A {
public $a = 2;
public function checkVar()
{
var_dump($this);
}
}
class B {
public $b = 10;
public function test()
{
A::checkVar();
}
}
$b = new B;
$b->test();
Смотрел документацию, но так и не понял. Почему в данном случае $this является объектом B?
Вопрос чисто ради интереса.
Когда вы обращаетесь к статичному методу А, у него еще нет переменной $this, так как она ведет на экземпляр, только self, которая ведет на класс. Другой вопрос, почему вообще срабатывает подобная штука, а не ругается на $this)
Тяжкое наследие PHP4. Сам нашёл её случайно когда тут чувак в вопросах показывал свой код. Но я так и не нашёл упоминание этой штуковины в документации, только в багах, что это именно фича.
И получается, что уже в PHP4 можно было использовать что-то на подобии трейтов: ).
В статическом методе нельзя использовать $this, так как он является методом класса, а не объекта.
Подобная же магия с наличием $this — это пережитки прошлого, когда в php 4 было ООП прикрученное через костыль и не было разницы между вызовом статического метода и метода объекта. Слова static вроде вовсе не было в контексте того ООП.
Почему выдается B более менее-понятно. Вы вызываете A::checkVar() как статический метод класса A. Соответственно, он вызывается в контексте объекта B, а $this ссылается на текущий контекст. Когда вы вызываете стаитческий метод класса, то объект не создается, соответственно, никакого $this у него нет.
т.к. определен клас В и из В вызывается А, тем более статическим методом, то и будет он отображать информацию о классе В (на сколько я понимаю проблему).
Если extends у В то информацию он будет отображать о обеих класса (могу ошибаться)