Я всегда использовал аннотации для объявления типа возвращаемого значения. Например:
/**
* @return SomeClass
*/
public function () { ... }
Но теперь я вижу, что есть другой способ:
public function () : SomeClass { ... }
Вопрос
Должен ли я выбирать между ними, использовать оба, или у них есть какое-то фундаментальное различие, о котором я должен знать?
По мне, вы должны использовать оба, когда это возможно.
Добавление возвращаемый тип функции в PHP (возможно из PHP 7) полезно для обеспечения типа во время выполнения. Обратите внимание, что PHP 7 позволяет поддерживать тип параметров в функции.
Добавление аннотации над функцией полезно для создания документации. пример PHPDocumentor использует аннотацию, как @вернуть.
Аннотация не имеет ничего общего с типом возвращаемого значения. Он не выдаст никакой ошибки или предупреждения, если вы возвращаете что-то еще. Хотя это полезно для документации.
Помимо этого другой метод является php7 Объявления возвращаемых типов которые поддерживают все те же типы, что и аргументы. Чтобы указать тип возвращаемого значения, мы добавляем двоеточие, а затем тип непосредственно перед открывающей фигурной скобкой.
Строгая типизация также влияет на объявления возвращаемых типов. В слабом режиме по умолчанию возвращаемые значения будут приводиться к правильному типу, если они еще не относятся к этому типу. В сильном режиме возвращаемое значение должно быть правильного типа, в противном случае выдается ошибка TypeError.
Добавление возвращаемого типа позволяет вам быть уверенным, что ваша функция возвращает ожидаемое, а также упростить предварительный просмотр работы функции.
НОТА :
При переопределении родительского метода дочерний метод должен соответствовать любому
возвращаем декларацию типа на родителя Если родитель не определяет
возвращаемый тип, тогда дочерний метод может сделать это.
Существует некоторая степень совпадения между ними.
В отличие от аннотаций типов, объявления типов являются частью самого языка и применяются языковой средой исполнения. Если вы используете объявление типа, чтобы указать, что функция принимает (или возвращает) int
, и вы передаете (или возвращаете) массив, вы получите ошибку. Если вы передадите плавающее число, PHP попытается преобразовать его для вас, если это возможно, и с ошибкой в противном случае (слабый режим), или всегда выдает ошибку (строгий режим). Объявления типов также проверяются в наследовании и при реализации интерфейсов, предотвращая использование неправильных типов в ваших реализациях. Аннотации, с другой стороны, являются просто комментариями и не применяются во время выполнения. Поскольку объявления типов являются обязательными, в идеале вы всегда должны использовать их там, где это возможно.
Поскольку аннотации типов и объявления типов могут служить документацией параметра или возвращаемого типа, аннотация является избыточной, если у вас есть объявление типа. Но имейте в виду, используете ли вы инструменты, такие как IDE или генератор документации, которые еще не распознают объявления типов, и вам потребуется сохранить аннотации. Следует также учитывать, что вы можете предоставить описание параметра или возвращаемого значения в аннотации для документации, чего нельзя сделать с помощью объявления типа, а также иногда бывают случаи, когда вы можете указать более точный тип в аннотации (например int[]
аннотация против array
объявление или подкласс класса, возвращаемого переопределяемым методом). Однако, если ни один из них не применяется, и ваши аннотации предоставляют не больше информации, чем в сигнатуре функции ( function foobar(int $foo, string $bar): Qux
линия), аннотации — пустая трата пространства.
Итак, в заключение: всегда используйте объявления типов. Что касается аннотаций, используйте их, если вам нужно (инструменты) или они предоставляют дополнительную информацию.