当一个方法将调用结果返回给另一个方法时,记录返回类型的合理方法是什么?
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';
}
}
当不确定A::foo()
将返回什么时,如何记录B::baz()
返回类型?将来,B::baz()
可能会发生变化,在这种情况下A::foo()
的返回类型会在不知不觉中发生变化。
这是代码味吗?可以设计更宽泛的代码,以便即使A::foo()
发生更改,B::baz()
的返回类型也是可预测的吗?
答案 0 :(得分:0)
如果我们正在使用更高类型的严格,你应该重构代码并告诉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
但在您的情况下,我会将B\bar
作为返回类型,因为您要返回类B
和方法bar
的实例。
* @return B\bar
*/
public function foo()
{
答案 1 :(得分:0)
如果您担心bar()
返回类型可能会发生变化,而不考虑您的foo()
期望的内容,那么我说这确实是代码味道。两者之间显然没有合同,因此A
与B
之间没有信任。
更实际的是,bar()
记录了以返回string
,因此将foo()
编码为返回bar()
的实际值返回,然后应记录foo()
以返回string
。对于doc生成器/ IDE来说,无法成为自动方式来跟上的,如果这是你的“后。
另一个仅限doc的选项是将foo()
的回复标记为mixed
,从而告诉读者"我不保证我返回的内容,因为我和#39; m只给你bar()
给我的东西,我不会提前知道那将是什么"。