Существует некоторая степень перекрытия между ними.
В отличие от аннотаций типа, объявления типа являются частью самого языка и принудительно исполняются во время выполнения языка. Если вы используете объявление типа, чтобы указать, что функция принимает (или возвращает) int
, и вы передаете (или возвращаете) массив, вы получите сообщение об ошибке. Если вы передадите float, PHP попытается преобразовать его для вас, если это возможно, и в противном случае - в противном случае (слабый режим) или всегда выдавать ошибку (строгий режим). Декларации типов также проверяются в наследовании и при реализации интерфейсов, что предотвращает использование неправильных типов в ваших реализациях. Аннотации, с другой стороны, являются просто комментариями и не исполняются во время выполнения. Поскольку объявления типов принудительно применяются, вы идеально всегда будете использовать их там, где это возможно.
Поскольку аннотации типов и декларации типов могут служить документацией для параметра или типа возвращаемого значения, аннотация является избыточной, если у вас есть объявление типа. Но имейте в виду, используете ли вы инструменты, такие как IDE или генератор документации, которые еще не распознают объявления типов, и вам нужно будет сохранить аннотации. Вы также должны учитывать, что вы можете предоставить описание параметра или возвращаемое значение в аннотации для документации, которую вы не можете сделать с объявлением типа, а также иногда случаются случаи, когда вы можете указать более точный тип в аннотации (например, int[]
аннотация по сравнению с array
декларацией или подклассом класса, возвращаемого методом, который вы переопределяете). Однако, если ни одно из них не применяется, и ваши аннотации не содержат больше информации, чем в сигнатуре функции (строка function foobar(int $foo, string $bar): Qux
), аннотации - это пустая трата пространства.
Итак, в целом: всегда используйте объявления типов. Что касается аннотаций, используйте их, если вам нужно (оснастка) или они предоставляют дополнительную информацию.
Ну, на его собственной аннотации ничего не делается. Вы могли бы вернуть что-то совершенно другое, и все равно. Но определение фактического типа возврата означает, что он должен быть такого типа ... –
устаревший? nah, как вы можете сказать, что хотите вернуть массив объектов DateTime? – Federkun