Почему PHP выдает ошибку совместимости, когда унаследованные интерфейсы используются для подсказок типов? - PullRequest
0 голосов
/ 30 сентября 2019

Пожалуйста, обратите внимание на следующие два блока кода. Ошибка и Предупреждение * Произведенные размещены под соответствующим кодовым блоком.

Мне кажется очень интересным ! Я думаю, что оба должны действовать одинаково, и они не должны выдавать никаких ошибок или предупреждений, поскольку они кажутся мне логически действительными.

Это ошибка PHP , или я пропускаючто-то?

Кстати, я считаю вопрос и код очень простым и не требующим пояснений, поэтому я не буду вдаваться в подробности. : -)

interface A {}

interface B extends A {}

class X implements A {
    public function test() : A {}
}

class Y extends X implements B {
    public function test() : B {}
}

Неустранимая ошибка: объявление Y :: test (): B должно быть совместимо с X :: test (): A

interface A {}

interface B extends A {}

class X implements A {
    public function test( A $a ) {}
}

class Y extends X implements B {
    public function test( B $b ) {}
}

Предупреждение: объявление Y :: test (B $ b) должно быть совместимо с X :: test (A $ a

1 Ответ

0 голосов
/ 30 сентября 2019

Я думаю, что нашел ответ сам.

Поскольку унаследованный интерфейс может иметь дополнительные объявления (у унаследованного типа могут быть дополнительные атрибуты), они логически совершенно разные, и тем самымОшибка / предупреждение, выдаваемое PHP, абсолютно правильные.

Спасибо, что прочитали вопрос и ответ. Надеюсь, это поможет другим лучше понять использование интерфейсов как типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...