Почему возможно создать интерфейс, не указывая тип возврата? Почему это не делает этот интерфейс неприменимым?
Это делает это более ясным:
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
?
Подсказка типов для аргументов или возвращаемых значений функций/методов поддерживается только в 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, если вы получаете что-то другое, кроме целого числа.
Само по себе то, что вы хотите, невозможно...
Короче говоря: если вам действительно нужно обеспечить соблюдение типов возврата в ваших кодовых контрактах, используйте статически типизированный язык.
Но благодаря магии __get
, __set
, __call
и друзей, вы можете определить базовый класс, который обеспечивает безопасность типов (я бы не рекомендовал это делать для чего-либо, кроме исследований/времени игры), но это все равно не поможет вам определить безопасные для типов интерфейсы.