ghost404
@ghost404
PHP Developer

Как уточнить/конкретизировать типа параметра метода при имплементации интерфейса в PHP?

На сколько я знаю этого сделать ни как нельзя, но на всякий случай спрашиваю так как наболело. Использую PHP 5.6

Суть проблемы:

Есть 4 класса с очень похожим интерфейсом. Приведу только 2
class Cover
{
    public function moveTmpFile(CoverInterface $entity)
    {
        // ..
    }

    public function removeOldFiles(CoverInterface $entity)
    {
        // ..
    }

    public function removeAllFiles(CoverInterface $entity)
    {
        // ..
    }
}

class OgImage
{
    public function moveTmpFile(OgImageInterface $entity)
    {
        // ..
    }

    public function removeOldFiles(OgImageInterface $entity)
    {
        // ..
    }

    public function removeAllFiles(OgImageInterface $entity)
    {
        // ..
    }
}


Интерфейсы CoverInterface и OgImageInterface кардинально отличаются. То есть эти сервисы имеют очень схожий интерфейс, но различную реализацию. Хочется для класса Cover и OgImage создать общий интерфейс. Если будет единый интерфейс то это позволит оптимизировать работу с сервисами. В идеале должно получится так:

Базовый интерфейс для $entity:
interface UploadableInterface
{
}


Наследуем его в CoverInterface и OgImageInterface
interface CoverInterface extends UploadableInterface
{
    public function getCover();

    public function setCover($filename);

    // ..
}


interface OgImageInterface extends UploadableInterface
{
    public function getOgImage();

    public function setOgImage($og_image);

    // ..
}


Базовый интерфейс для сервисов:
interface UploaderInterface
{
    public function moveTmpFile(UploadableInterface $entity);

    public function removeOldFiles(UploadableInterface $entity);

    public function removeAllFiles(UploadableInterface $entity);
}


наследуем интерфейс с уточнением/конкретизацией типа параметра
class Cover implements UploaderInterface
{
    public function moveTmpFile(CoverInterface $entity)
    {
        // ..
    }

    public function removeOldFiles(CoverInterface $entity)
    {
        // ..
    }

    public function removeAllFiles(CoverInterface $entity)
    {
        // ..
    }
}

class OgImage implements UploaderInterface
{
    public function moveTmpFile(OgImageInterface $entity)
    {
        // ..
    }

    public function removeOldFiles(OgImageInterface $entity)
    {
        // ..
    }

    public function removeAllFiles(OgImageInterface $entity)
    {
        // ..
    }
}


Выглядит здорово, но так сделать нельзя. PHP требует что бы методу принимали только UploadableInterface и ни что другое. Единственное решение этой задачи не указывать тип параметра вообще, но это решение не годится.
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Класс может реализовать несколько интерфейсов и никакое наследование для решения вашей задачи не нужно:
class Entity implements FirstInterface, SecondInterface


Более того, если хорошенько подумать о том что такое интерфейсы и зачем они нужны, становится ясно, что термин "наследование" к ним не применим в принципе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы