Наткнулся на довольно спорную и интересную проблемы. Давайте предположим, что у нас есть внешнее api (валяется где-то в папке вендоров) и есть интерфейс, который мне нужно реализовать.
Например:
interface MyInterface {
public function save($data);
}
Теперь собственно ситуация такая, давайте представим, что стороннее апи работает с этим интерфейсом и внутри моего проекта для удобства я тоже хочу работать с этим интерфейсом. Теперь о проблеме:
Внешнее апи ничего не знает про $data. Тоесть это может быть массив или объект или вообще строка. Но внутри моего проекта к примеру один из репозиториев реализует данный интерфейс и четко знает, что работает с неким объектом MyObject, который ожидает для реализации метода save().
Так вот проблема в том, что нет никакой возможности усилить type hinting данного интерфейса, чтобы вышло как-то так:
interface MyInterface {
public function save(MyObject $data);
}
Собственно нельзя сделать даже так:
interface MyInterface2 extends MyInterface {
public function save(MyObject $data);
}
Собственно остается только вот такой вариант в реализации метода:
if (!$data instanceof MyObject) {
throw new \ErrorException('Описание ошибки ...');
}
Собственно есть ли какие-то альтернативы и если есть спецы, которые подскажут почему в пхп не реализовано изменение type hinting в интерфейсах, будет здорово.
Пример:
sandbox.onlinephpfunctions.com/code/4748c681012738...