@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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 09:39
20000 руб./за проект
24 апр. 2024, в 09:32
25000 руб./за проект
24 апр. 2024, в 09:27
13000 руб./за проект