Постараюсь объяснить на анти-примере.
Ну вот допустим пришли вы на новое место работы, в котором какое-то время делают какой-то проект.
Вам дают задачу вывести на фронт ранг пользователя.
Вася Пупкин говорит, что уже написал метод для получения ранга пользователя - getUserRank и вам нужно просто использовать его. Вроде все хорошо, но вы открываете исходники и видите вот такую картину:
(
примеры абстрактные, написанные на коленке)
class UserUtils {
public function getUserRank($user) {
// 20-30 строк кода
}
}
Смотрите вы на этот метод и думаете:
Что такое $user? Это строка с логином? Это id-шник? Это объект ORM?
А что возвращает метод? Число? Объект ORM?
И вместо-того, чтобы приступить непосредственно к реализации задачи, вы сидите и читаете Васин код, чтобы понять, что надо передавать.
А если бы метод выглядел примерно так:
class UserUtilsWithTypes {
public function getUserRank(UserModel $user) : int {
// code
}
}
То вы бы сразу поняли, что $user это объект ORM, а метод возвращает метод число.
Да, стоит добавить, что помимо объявления типа следует и имя аргумента указывать соответствующее его типу (например для bool часто вижу имена вроде
$is_[что-то]
), но речь сейчас не об этом.