worldlight
@worldlight
Просто программист

Зачем нужны объявления типов php?

У меня появился вопрос: зачем нужны объявления типов в аргументе метода php. К примеру типов классов. Скажи зачем это нужно, как это работает, какие типы можно объявлять?
Пример кода:
class ExampleOne{}

class ExampleTwo extends ExampleOne {
    public function test(ExampleOne $a) {
        return $a;
    }
}


Встречал на гитхабе но там не описывали зачем это, читал документалку и тоже не понял зачем это.
  • Вопрос задан
  • 204 просмотра
Решения вопроса 3
AlexNest
@AlexNest
Работаю с Python/Django
Постараюсь объяснить на анти-примере.
Ну вот допустим пришли вы на новое место работы, в котором какое-то время делают какой-то проект.
Вам дают задачу вывести на фронт ранг пользователя.
Вася Пупкин говорит, что уже написал метод для получения ранга пользователя - 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_[что-то]), но речь сейчас не об этом.
Ответ написан
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Для этого надо понимать, для чего нужны сообщения об ошибках.

Многие новички этого не понимают, и думают, что это приставучий интерпретатор пишет какую-то ерунду, от которой надо избавляться любыми доступными способами.
Но как только начинаешь понимать, что сообщения об ошибках придуманы чтобы помогать программисту, то все становится на свои места.

Если объявить тип переменной, то если в функцию передать аргумент неподходящего типа, РНР сможет сообщить о проблеме раньше, чем код сломается, попытавшись ее использовать.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Тайп хинтинг нужен, что бы уменьшить количество ошибок, в идеале со строгой декларацией типов.

Что будет, если вы запихнете в функцию обрабатывающую строки например объект? В случае явного указания типа вы получите исключение. Если этого не делать поведение полностью зависит от тела функции, и худшим сценарием будет не правильный результат без ошибок и исключений. Подобные проблемы может быть очень сложно отследить
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы