Почему возможно иметь интерфейс без типа возврата в PHP?

Почему возможно создать интерфейс, не указывая тип возврата? Почему это не делает этот интерфейс неприменимым?

Это делает это более ясным:

Interface run
{
    public function getInteger();
}

class MyString implements run
{    
    public function myNumber()
    {

    }

    public function getInteger()
    {  
        return "Not a number";
    }    
}

В Java каждый Интерфейс имеет тип возврата как Integer, String или Void

Я знаю, что PHP является, к сожалению, свободно типизированным языком, но не является там решением той проблемы?

Действительно ли возможно определить Интерфейс с типом возврата как Integer?

13
задан 6 revs, 5 users 52% 14 September 2016 в 23:13
поделиться

3 ответа

Подсказка типов для аргументов или возвращаемых значений функций/методов поддерживается только в PHP7.0 или более поздних версиях

Подробности здесь: http://php.net/manual/en/migration70.new-features.php

Если вы используете PHP5, то текущая принятая практика заключается в использовании phpdoc комментариев, чтобы указать на наличие "контракта".

/** 
 * Does something.
 * @return int
 **/
public function getInteger() { return 1; }

Если код нарушает "контракт", я предлагаю найти оригинального кодера и попросить его исправить его и/или зафиксировать ошибку и/или исправить его самостоятельно, если он находится в вашей собственной кодовой базе.

19
ответ дан 1 December 2019 в 20:42
поделиться

Нет, не существует. Вы сами назвали причину: PHP слабо типизирован.
Вы можете иметь подсказки в PHPDoc, или проверять тип в функции, используя функции интерфейса, и бросать InvalidArgumentException, если вы получаете что-то другое, кроме целого числа.

5
ответ дан 1 December 2019 в 20:42
поделиться

Само по себе то, что вы хотите, невозможно...

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

Но благодаря магии __get, __set, __call и друзей, вы можете определить базовый класс, который обеспечивает безопасность типов (я бы не рекомендовал это делать для чего-либо, кроме исследований/времени игры), но это все равно не поможет вам определить безопасные для типов интерфейсы.

0
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: