nepster-web
@nepster-web

Почему в php нельзя расширять интерфейсы?

Наткнулся на довольно спорную и интересную проблемы. Давайте предположим, что у нас есть внешнее 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...
  • Вопрос задан
  • 722 просмотра
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
Документацию внимательно читайте, потом задавайте сомнительные вопросы.

php.net/manual/en/language.oop5.interfaces.php

<?php

interface Foo
{
  public function bar(string $baz);
}

interface Baz extends Foo
{
  public function bar(PDO $baz);
}
Ответ написан
Потому что интерфейсы обязаны следовать принципу подстановки Лисков. В этом их смысл: сохранять совместимость с родительским интерфейсом; а ещё потому что в PHP нет перегрузки функций ввиду его динамической природы типизации.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы