如何记录来自另一种方法的 return 类型?

How do I document the return type which comes from another method?

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

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() 将 return 是什么类型,我如何记录 A::foo() return 类型?将来,B::baz() 可能会发生变化,在这种情况下,A::foo() 的 return 类型会在不知不觉中发生变化。

这是代码味道吗?是否可以设计更宽的代码,以便即使 B::baz() 发生变化,A::foo() 的 return 类型也是可预测的?

如果我们谈论的是更高的类型严格,你应该重构你的代码并告诉 bar() 哪种类型将被 returned : (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 作为 return 类型,因为你 returning class B 和方法的实例bar.

         * @return B\bar
         */
        public function foo()
        { 

如果您担心 bar() return 类型会发生变化而不考虑您的 foo() 期望的内容,那么我会说这确实是一种代码味道。两者之间显然没有合同,因此 AB 之间没有信任。

更实际地说,bar() 记录为 到 return string,所以通过将 foo() 编码为 return bar() 的实际 return,那么 foo() 也应该记录为 return string。文档生成器/IDE不会有自动方式跟上这个为你,如果那是你之后。

另一个仅限文档的选项是将 foo() 的 return 标记为 mixed,从而告诉 reader "I make no guarantees on what I return, because I'm only giving you what bar() gave me, and I don't know ahead of time what that will be".