Почему возможно иметь интерфейс без типа возврата в 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
и друзей вы можете определить базовый класс, который обеспечивает безопасность типов (я бы не рекомендовал это ни для чего другого, кроме исследования/воспроизведения), но это все равно не поможет вам определить безопасные интерфейсы типов.