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

时间:2018-01-26 16:57:30

标签: php documentation phpdoc

当一个方法将调用结果返回给另一个方法时,记录返回类型的合理方法是什么?

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()的返回类型也是可预测的吗?

2 个答案:

答案 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()期望的内容,那么我说这确实是代码味道。两者之间显然没有合同,因此AB之间没有信任。

更实际的是,bar() 记录了以返回string,因此将foo()编码为返回bar()的实际值返回,然后应记录foo()以返回string。对于doc生成器/ IDE来说,无法成为自动方式来跟上,如果这是你的“后。

另一个仅限doc的选项是将foo()的回复标记为mixed,从而告诉读者"我不保证我返回的内容,因为我和#39; m只给你bar()给我的东西,我不会提前知道那将是什么"。