#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
вы увидите разницу.