Как уточнить/конкретизировать типа параметра метода при имплементации интерфейса в 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 и ни что другое. Единственное решение этой задачи не указывать тип параметра вообще, но это решение не годится.
В PHP 5.6 и более ранних версиях, действительно, нельзя уточнять тип параметра метода в имплементации интерфейса. Использование интерфейса с более общим типом параметра является универсальным решением. Если вам критически важно иметь типизацию параметра в имплементации интерфейса, вы можете рассмотреть возможность обновления версии PHP до 7.0 и выше, где появились возможности строгой типизации параметров и возвращаемых значений.
Таким образом, в PHP 7.0 и выше вы сможете уточнять тип параметра в имплементации интерфейса и использовать более строгую типизацию для улучшения безопасности и удобства кодирования.
В PHP 5.6 и более ранних версиях, действительно, нельзя уточнять тип параметра метода в имплементации интерфейса. Использование интерфейса с более общим типом параметра является универсальным решением.
Если вам критически важно иметь типизацию параметра в имплементации интерфейса, вы можете рассмотреть возможность обновления версии PHP до 7.0 и выше, где появились возможности строгой типизации параметров и возвращаемых значений.
Таким образом, в PHP 7.0 и выше вы сможете уточнять тип параметра в имплементации интерфейса и использовать более строгую типизацию для улучшения безопасности и удобства кодирования.