Почему возможно иметь интерфейс без типа возврата в PHP? - PullRequest
13 голосов
/ 15 июня 2010

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

Это делает его более понятным:

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?

Ответы [ 4 ]

19 голосов
/ 15 июня 2010

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

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

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

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

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

5 голосов
/ 17 июля 2015

Следует отметить, что теперь это возможно с PHP7 (только Beta1 был выпущен на момент написания)

Это возможно со следующим синтаксисом:

interface Run
{
    public function getInteger(): int;
}

class MyString implements Run
{    
    public function myNumber()
    {

    }

    public function getInteger()
    {  
        return "Not a number";
        // Throws a fatal "Catchable fatal error: Return value of getInteger() must be of the type integer, string returned in %s on line %d"
    }    
}
5 голосов
/ 15 июня 2010

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

0 голосов
/ 15 июня 2010

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

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

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