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

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