当一个方法返回对另一个方法的调用结果时,记录返回类型的明智方法是什么?
class A
{
/**
* @return [How do I know here what bar will return?]
*/
public function foo()
{
$b = new B();
return $b->bar();
}
}
class B
{
/**
* @return string
*/
public function bar()
{
return 'baz';
}
}
当不确定B::baz()
将返回什么时,如何记录A::foo()
返回类型?将来,B::baz()
可能会更改,在这种情况下,A::foo()
的返回类型会在不知不觉中更改。
这是代码异味吗?是否可以设计更广泛的代码,以便即使B::baz()
更改,A::foo()
的返回类型也是可预测的?
如果您担心 bar()
返回类型可能会更改而不考虑您的foo()
期望的内容,那么我会说它确实是一种代码异味。 两者之间显然没有合同,所以A
对B
没有信任。
更实际的是,bar()
被记录为返回string
,所以通过foo()
编码返回bar()
的实际返回,那么foo()
也应该被记录为返回string
。 文档生成器/IDE不会有一种自动的方式来跟上你的步伐,如果这就是你所追求的。
另一个仅限文档的选项是将foo()
的回归标记为mixed
,从而告诉读者"我不保证我返回的内容,因为我只给你bar()
给我的东西,我事先不知道那会是什么"。
如果我们谈论的是更高的类型严格,你应该重构你的代码并告诉 bar(( 将返回哪种类型:(PHP>7.0(
class A
{
/**
* @return string
*/
public function foo()
{
$b = new B();
return $b->bar();
}
}
class B
{
/**
* @return string
*/
public function bar() : string
{
return 'baz';
}
}
参考: http://php.net/manual/en/migration70.new-features.php
但是在您的情况下,我会Bbar
作为返回类型,因为您返回的是类 B
和方法bar
的实例。
* @return Bbar
*/
public function foo()
{