@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?
  • Вопрос задан
  • 241 просмотр
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
через интерфейсы: `function setFoo(FooInterface $instance)`, интерфейс описывает методы, абстрактные классы - базовую реализацию этих методов, для примера реализация шаблона адаптер на примере БД: интерфейс адаптера СУБД, абстрактный адаптер для mysql реализующий интерфейс, класс расширяющий абстрактный адаптер mysql на основе php расширения mysql + класс расширяющий абстрактный адаптер mysql на основе php расширения mysqli
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы