Неожиданное поведение наследования кода php

#php

#php

Вопрос:

Я написал этот код для проверки поведения моего приложения, и я не понимаю, почему этот код работает. У меня есть 2 класса и 1 точка входа

PHP 7.2

 class Base{

    public function check(){
       return $this->checkUnexist();
    }

}

class Main extends Base
{
    public function checkUnexist()
    {
        return 'UNEXIST METHOD CALLED';
    }
}

$main = new Main();
echo $main->check();
  

Ожидаемый результат что-то вроде вызываемого метода unexist . Но он вызывает метод из дочернего класса с помощью «this». Почему? И где я могу прочитать об этой проблеме?

Комментарии:

1. Базовый класс не должен вызывать методы, которые существуют только в дочерних классах. Можете ли вы привести более конкретный пример, который может помочь в правильном создании структуры классов.

2. Вы создали object ( Main ), который имеет checkUnexist функцию. Почему вы ожидаете, что он не вызывается при попытке его вызвать?

3. @NigelRen я так думаю. Но это работает. Просто запустите его.

4. @GregSchmidt потому что он вызывает с помощью «this» из родительского класса. это очевидно

5. Ваше понимание наследования объектов довольно обратное. Прочитайте о классах и объектах в руководстве по PHP или об объектно-ориентированном программировании в целом.

Ответ №1:

Попытка получить доступ к дочерним значениям из базового (родительского) класса — плохой дизайн. Что, если в будущем кто-то создаст другой класс на основе вашего родительского класса, забыв создать это конкретное свойство, к которому вы пытаетесь получить доступ в своем родительском классе?

Насколько я понимаю, когда вы расширяете класс, дочерний класс обладает всеми свойствами, доступными для методов Main class object , которые доступны за пределами класса.

Итак, когда вы создали объект Main class своего класса, внутренне выглядит так

 class Main
{
    public function checkUnexist()
    {
     return 'UNEXIST METHOD CALLED';
    }

    public function check(){
     return $this->checkUnexist();
    }
}
  

метод проверки существует, и вы получите ответ. Попробуйте создать метод checkUnexist private , или protected вы увидите разницу.