Как уточнить/конкретизировать типа параметра метода при имплементации интерфейса в PHP? На сколько я знаю этого сделать ни как нельзя, но на всякий случай спрашиваю так как наболело. Использую PHP 5.6
Суть проблемы:
Есть 4 класса с очень похожим интерфейсом. Приведу только 2class 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 и OgImageInterfaceinterface 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 и ни что другое. Единственное решение этой задачи не указывать тип параметра вообще, но это решение не годится.

21 Авг 2019 в 07:04
252 +1
1
Ответы
1

В PHP 5.6 и более ранних версиях, действительно, нельзя уточнять тип параметра метода в имплементации интерфейса. Использование интерфейса с более общим типом параметра является универсальным решением.
Если вам критически важно иметь типизацию параметра в имплементации интерфейса, вы можете рассмотреть возможность обновления версии PHP до 7.0 и выше, где появились возможности строгой типизации параметров и возвращаемых значений.

Таким образом, в PHP 7.0 и выше вы сможете уточнять тип параметра в имплементации интерфейса и использовать более строгую типизацию для улучшения безопасности и удобства кодирования.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир