Почему возможно создать интерфейс без указания типа возврата? Почему это не делает этот интерфейс непригодным для использования?
Это делает его более понятным:
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
?
Тип hinting для аргументов функции / метода или возвращаемых значений поддерживается только на PHP7.0 или новее
Проверьте информацию здесь: http://php.net/manual/en/migration70.new-features.php
Если вы используете PHP5, поэтому принятая в настоящее время практика заключается в использовании комментариев phpdoc для обозначения «контракта».
/** * Does something. * @return int **/ public function getInteger() { return 1; }
Если код нарушает «контракт», я предлагаю найти исходный кодер и исправить его и / или зарегистрировать ошибку и / или исправить ее самостоятельно, если она находится в вашей собственной базе кода.
Нет, нет. Вы сами сказали причину: PHP слабо напечатан.
Вы можете иметь подсказки в PHPDoc или проверять тип функции, которую используете функции интерфейса, и бросать InvalidArgumentException, если вы получаете что-то еще, кроме целого.
Следует отметить, что теперь это возможно с помощью 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" } }
Само по себе то, что вы хотите, невозможно …
Короче: если вам действительно нужно принудительно вводить типы возвращаемых данных в контракты с кодом, используйте статически типизированный язык.
Но благодаря магии __get
, __set
, __call
и друзей вы можете определить базовый класс, который обеспечивает безопасность типов (я бы не рекомендовал это ни для чего другого, кроме исследования / воспроизведения), но это все равно не поможет вам определить безопасные интерфейсы типа ,