На сколько я знаю этого сделать ни как нельзя, но на всякий случай спрашиваю так как наболело. Использую 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 и ни что другое. Единственное решение этой задачи не указывать тип параметра вообще, но это решение не годится.