如何记录来自其他方法的返回类型



当一个方法返回对另一个方法的调用结果时,记录返回类型的明智方法是什么?

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()期望的内容,那么我会说它确实是一种代码异味。 两者之间显然没有合同,所以AB没有信任。

更实际的是,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()
        { 

相关内容

最新更新