DocBlock类类型继承

时间:2012-09-11 21:07:24

标签: php javadoc phpdoc docblocks

虽然这个问题一般是DocBlocks,但我的用例是关于PHP的。

考虑以下PHP代码:

<?php

class ParentClass {
    /**
     * Says 'hi' to the world.
     * @return ParentClass Returns itself for chaining.
     */
    public function say_hi(){
        echo 'hi';
        return $this;
    }
}

class ChildClass extends ParentClass {
    /**
     * Says 'bye' to the world.
     * @return ChildClass Returns itself for chaining.
     */
    public function say_bye(){
        echo 'bye';
        return $this;
    }
}

$c = new ChildClass;
$c->say_hi()->say_b| <- type hinting won't suggest "say_bye" here

?>

这只是一个带有一些链接的微不足道的课程。扩展类失去了类型提示,因为父类的docblock正在使用一个没有子类的方法/属性的特定类名。

假设我们确实需要类型提示功能,(如果没有,请留下这个问题 - 我不想在这里使用无用的参数),我该如何解决这个问题?

我提出了以下可能性:

  • 更改PHPDoc标准以允许特殊关键字
  • 添加一个多余的say_hi()方法,该方法只调用父级重新声明docblock
  • 根本不指定返回类型,让IDE决定return $this;的含义(这甚至可以工作吗?)

2 个答案:

答案 0 :(得分:4)

您可以这样解决:

class ParentClass {
    /**
     * Says 'hi' to the world.
     * @return static
     */
    public function say_hi(){
        echo 'hi';
        return $this;
    }
}

“@return static”语句允许你想要的,PhpStorm可以正常使用它。

答案 1 :(得分:2)

您所描述的通常被称为“流畅的界面”,其中所有对象的方法都可以完成工作并返回对象本身。

我个人没有看到任何关于如何做到这一点的PHPDoc指南。因此,我不知道任何IDE都提供了自动完成功能来处理用例的方法。

PHPDoc可能采用的一种方法是利用“@return $ this”作为表示流畅方法的约定,因为它与代码语法本身相匹配,因此非常清楚。我怀疑任何IDE都会构建这种功能,直到标准本身包含这个用例。

在短期内,我认为您多余的“ChildClass :: say_hi(){parent :: say_hit();}”可能让您的IDE自动完成工作。同样,可能,因为拥有自动完成功能还可识别方法链接本身(例如$ foo-&gt; bar() - &gt; baz() - &gt; roll() - &gt; tide();)可能不存在。