2016-12-01 1 views
5

Я всегда использовал аннотации для объявления типа возврата. Например:Дописывают ли типы деклараций и аннотации типов устаревшие или дополняют друг друга?

/** 
* @return SomeClass 
*/ 
public function() { ... } 

Но теперь я вижу, что есть еще один способ:

public function() : SomeClass { ... } 

Вопрос

Должен ли я выбирать между ними, используя как, или же они имеют некоторую фундаментальную разницу I должен знать?

+0

Ну, на его собственной аннотации ничего не делается. Вы могли бы вернуть что-то совершенно другое, и все равно. Но определение фактического типа возврата означает, что он должен быть такого типа ... –

+0

устаревший? nah, как вы можете сказать, что хотите вернуть массив объектов DateTime? – Federkun

ответ

2

Аннотация не имеет отношения к типу возврата. Он не будет вызывать никаких ошибок или предупреждений, если вы возвращаете что-то еще. Хотя это полезно для документации.

Помимо этого, другой метод - php7 Return Type Declarations, который поддерживает все те же типы, что и аргументы. Чтобы указать тип возврата, мы добавляем двоеточие, а затем тип прямо перед открывающей фигурной скобкой.

Строгое типирование также влияет на декларации типа возврата. В слабом режиме по умолчанию возвращаемые значения будут принудительно введены в правильный тип, если они еще не относятся к этому типу. В сильном режиме возвращаемое значение должно быть правильного типа, иначе будет выдано TypeError.

Добавление типа возвращаемого значения позволяет вам убедиться, что ваша функция возвращает ожидаемое, а также позволяет легко увидеть, как работает функция.

Примечание:

При переопределении родительского метода, метод ребенка должен соответствовать любому типу декларация возврата на родителе. Если родительский элемент не определяет возвращаемый тип , тогда может быть использован дочерний метод.

+3

Вопрос не в том, «каковы типы возврата?» – Federkun

+0

@Federkun: Тигр просто проводит различие между двумя вопросительными опциями, поскольку они, похоже, имеют неправильный конец палки, когда дело доходит до различий между ними. То, что они также объясняют, какие типы возврата являются лишь частью разъяснения. Это хороший ответ. –

+0

@AdamCameron Спасибо. :) – Tiger

2

Согласно мне, вы должны использовать оба варианта, когда это возможно.

Добавление return type of function в PHP (возможно из PHP 7) полезно для обеспечения типа во время выполнения. Обратите внимание, что PHP 7 позволяет поддерживать тип параметров в функции.

Добавление функции аннотации выше полезно для создания документации. В примере PHPDocumentor используется аннотация, например @return.

2

Существует некоторая степень перекрытия между ними.

В отличие от аннотаций типа, объявления типа являются частью самого языка и принудительно исполняются во время выполнения языка. Если вы используете объявление типа, чтобы указать, что функция принимает (или возвращает) int, и вы передаете (или возвращаете) массив, вы получите сообщение об ошибке. Если вы передадите float, PHP попытается преобразовать его для вас, если это возможно, и в противном случае - в противном случае (слабый режим) или всегда выдавать ошибку (строгий режим). Декларации типов также проверяются в наследовании и при реализации интерфейсов, что предотвращает использование неправильных типов в ваших реализациях. Аннотации, с другой стороны, являются просто комментариями и не исполняются во время выполнения. Поскольку объявления типов принудительно применяются, вы идеально всегда будете использовать их там, где это возможно.

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

Итак, в целом: всегда используйте объявления типов. Что касается аннотаций, используйте их, если вам нужно (оснастка) или они предоставляют дополнительную информацию.

+1

Я бы добавил, что это может быть полезно с наследованием, когда фактический возвращаемый тип уже, чем тип родителей, и есть определенные операции, доступные только для этого возвращаемого типа. [Потому что PHP не нуждается в ковариационной поддержке здесь] – bwoebi

+0

Хорошая точка. Бывают случаи, когда аннотации типов могут указывать более точный или точный тип возврата. – Andrea

Смежные вопросы