Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как в данном случае работает наследование?

Зравствуйте!

Дополните пожалуйста цепочку моих рассуждений , без ссылок на матчасть (слишком не хочется перерывать кучу инфы, для того, чтобы найти один нюанс).

class A{
	public function method(){
		return $this->prop; 
	}
};

class B extends A{
	private $prop = 10;
};

$b = new B();

$b->method(); /* Fatal error:  Uncaught Error: Cannot access private property B::$prop */


1. вызываем метод класса B::method()

2. у данного класса нету собственного метода method(), поэтому выполняем поиск (и на ходим) метод у родительского класса A

3. в методе класса A ключевое слово $this указывает на класс B ( object(B)#1(1){["prop": "B": private]=>int(10)})

4. но при этом возникает ошибка
Fatal error:  Uncaught Error: Cannot access private property B::$prop


Офк данный пример работает , если бы свойство $prop объекта класса B было либо protected либо public. Непонятен момент , почему вроде как в методе A::method(), $this указывает на объект класса B, но при этом приватное свойство не может вернуть? Наверное всё дело в том ,где вызывается метод и где он был определён, но могу ошибаться...
  • Вопрос задан
  • 253 просмотра
Пригласить эксперта
Ответы на вопрос 2
TTATPuOT
@TTATPuOT
https://code.patriotovsky.ru/
То, что написано в целом - это самый настоящий говнокод. Класс A не является самостоятельным и при попытке сделать его экземпляр и вызвать A->method() программист получит ошибку в любом случае. Так делать нельзя, независимо от логического обоснования того, что здесь происходит.

А явление, которое вы наблюдаете называется умными словами позднее статическое связывание (3 пример). Почитать кучу текста всё-таки придётся, этот нюанс в двух словах не объяснить, что вы хотели?
Ответ написан
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Да всё очень просто.
Приватное свойство доступно только в том классе, в котором оно объявлено. Оно не наследуется.
Вас смущает тот факт, что $this указывает на второй класс, но по факту вызывается метод класса А, и у него не будет доступа к приватным свойствам других классов.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 мар. 2024, в 11:54
3000 руб./за проект
19 мар. 2024, в 11:52
3000 руб./за проект
19 мар. 2024, в 11:49
10000 руб./за проект