Задать вопрос
GetWindowsDirectory
@GetWindowsDirectory
PHP Senior Developer

Не понятное поведение при обращении к методу

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?
Вопрос чисто ради интереса.
  • Вопрос задан
  • 2914 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
Urvin
@Urvin
Смущает отсутствие extends у B или static у A. PHP это тоже смущает.
Ответ написан
Тяжкое наследие PHP4. Сам нашёл её случайно когда тут чувак в вопросах показывал свой код. Но я так и не нашёл упоминание этой штуковины в документации, только в багах, что это именно фича.

И получается, что уже в PHP4 можно было использовать что-то на подобии трейтов: ).
Ответ написан
Комментировать
AmdY
@AmdY
PHP и прочие вебштучки
В статическом методе нельзя использовать $this, так как он является методом класса, а не объекта.
Подобная же магия с наличием $this — это пережитки прошлого, когда в php 4 было ООП прикрученное через костыль и не было разницы между вызовом статического метода и метода объекта. Слова static вроде вовсе не было в контексте того ООП.
Ответ написан
Комментировать
loingrim
@loingrim
Почему выдается B более менее-понятно. Вы вызываете A::checkVar() как статический метод класса A. Соответственно, он вызывается в контексте объекта B, а $this ссылается на текущий контекст. Когда вы вызываете стаитческий метод класса, то объект не создается, соответственно, никакого $this у него нет.

www.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.this

Если нужно получить A, то нужно сделать $a = new A(); $a->checkVar();
Ответ написан
Комментировать
m1z0
@m1z0
т.к. определен клас В и из В вызывается А, тем более статическим методом, то и будет он отображать информацию о классе В (на сколько я понимаю проблему).

Если extends у В то информацию он будет отображать о обеих класса (могу ошибаться)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы