Почему возможно иметь интерфейс без типа возврата в 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?

Ответы

Ответ 1

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

Проверьте информацию здесь: http://php.net/manual/en/migration70.new-features.php

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

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

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

Ответ 2

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

Ответ 3

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

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

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"
    }    
}

Ответ 4

В самом деле, чего вы хотите, невозможно...

Вкратце: если вам действительно нужно принудительно вводить типы возвращаемых данных в контракты с кодом, используйте статически типизированный язык.

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