我一直使用注释来声明返回类型。例如:
/**
* @return SomeClass
*/
public function () { ... }
但现在我看到还有另一种方式:
public function () : SomeClass { ... }
问题
我应该在这两者之间进行选择,同时使用它们,还是它们有一些我应该注意的根本区别?
我一直使用注释来声明返回类型。例如:
/**
* @return SomeClass
*/
public function () { ... }
但现在我看到还有另一种方式:
public function () : SomeClass { ... }
问题
我应该在这两者之间进行选择,同时使用它们,还是它们有一些我应该注意的根本区别?
这些之间有一定程度的重叠。
与类型注释不同,类型声明是语言本身的一部分,并由语言运行时强制执行。如果使用类型声明来指定函数接受(或返回) an int
,并且传入(或返回)数组,则会出现错误。如果你传入一个浮点数,PHP 将尽可能为你转换它,否则会出错(弱模式),或者总是抛出错误(严格模式)。在继承和实现接口时也会检查类型声明,防止您在实现中使用错误的类型。另一方面,注释只是注释,运行时不会强制执行。因为类型声明是强制执行的,所以理想情况下您总是尽可能使用它们。
由于类型注释和类型声明都可以用作参数或返回类型的文档,因此如果您有类型声明,则注释是多余的。但请记住,您使用的工具(例如 IDE 或文档生成器)是否还不能识别类型声明,并且需要您保留注释。您还应该考虑您可以在文档的注释中提供参数或返回值的描述,这是您无法使用类型声明的,并且有时您可以在注释中指定更精确的类型(例如int[]
注释与array
声明,或您要覆盖的方法返回的类的子类)。但是,如果这些都不适用,并且您的注释提供的信息不超过函数签名(function foobar(int $foo, string $bar): Qux
行)中的信息,那么注释就是浪费空间。
所以,总而言之:总是使用类型声明。至于注释,如果您需要(工具)或它们提供额外信息,请使用它们。
注解与返回类型无关。如果您返回其他内容,它不会抛出任何错误或警告。尽管它对文档很有帮助。
除此之外,另一种方法是 php7返回类型声明,它支持所有与参数相同的类型。要指定返回类型,我们添加一个冒号,然后在左大括号之前添加类型。
严格类型也会对返回类型声明产生影响。在默认的弱模式下,如果返回的值还不是正确的类型,则它们将被强制转换为正确的类型。在强模式下,返回的值必须是正确的类型,否则会抛出 TypeError。
添加返回类型可以确保您的函数返回预期的内容,并且可以轻松地预先了解函数的工作原理。
笔记 :
覆盖父方法时,子方法必须匹配父方法的任何返回类型声明。如果父方法没有定义返回类型,那么子方法可能会这样做。
根据我的说法,您应该尽可能同时使用两者。
在 PHP 中添加函数的返回类型(可能从 PHP 7 开始)对于确保执行期间的类型很有用。请注意,PHP 7 允许在函数中支持参数类型。
在函数上方添加注释对于生成文档很有用。示例PHPDocumentor使用注释,例如@return。