Задать вопрос
@qbudha
Чых-пыхдевелопер

Как работает полиморфизм в php через абстрактные классы и абстрактные методы?

Есть набор доктриновских сущностей entities и есть код, который должен с этими сущностями, что-то делать.
Т.к. сущностей и способов использования сущностей будет много, то хочу в абстрактных классах обозначить базовые методы.
<?php
namespace App\Entity;

abstract class AbstractEntity;
{
    //...
}

<?php
namespace App\AnotherName;

use App\Entity\AbstractEntity;

abstract class AbstractService
{
    abstract public function create(AbstractEntity $entity);
}

<?php
namespace App\Entity;

class AnotherEntity extend AbstractEntity;
{
    //...
}

Шторм начал ругаться на нижеследующий код - объявление метода должно совпадать с тем, что есть в абстрактном классе.
<?php
namespace App\Service\AnotherName;

use App\Entity\AnotherEntity;

class FooService extend AbstractService
{
    public function create(AnotherEntity $anotherEntity) {
        //...
    }
}

А вот на такой код, не ругается:
<?php
namespace App\Service\AnotherName;

use App\Entity\AbstractEntity;

class FooService extend AbstractService
{
    public function create(AbstractEntity $anotherEntity) {
        //...
    }
}

И так как пока пхпшторм в плане пхпшного ооп понимает больше чем я, то возник вопрос -
я правильно понимаю, что для того, чтобы метод create в классах сервисов отнаследованных от AbstractService работал с любыми сущностями отнаследованными от AbstractEntity нужно оставить на входе метода create дочерних классов AbstractService тип параметра AbstractEntity?
  • Вопрос задан
  • 266 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
через интерфейсы: `function setFoo(FooInterface $instance)`, интерфейс описывает методы, абстрактные классы - базовую реализацию этих методов, для примера реализация шаблона адаптер на примере БД: интерфейс адаптера СУБД, абстрактный адаптер для mysql реализующий интерфейс, класс расширяющий абстрактный адаптер mysql на основе php расширения mysql + класс расширяющий абстрактный адаптер mysql на основе php расширения mysqli
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽