DocBlock类类型继承



虽然这个问题通常是关于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;的含义(这行得通吗?)

你可以这样解决这个问题:

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

"@return static"语句完全可以满足您的需求,PhpStorm可以很好地使用它。

您所描述的通常被称为"fluent接口",对象的所有方法都在其中完成工作并返回对象本身。

我个人还没有看到PHPDoc关于如何做到这一点的指导方针最终确定。因此,我不知道任何IDE已经为其自动完成功能提出了处理用例的方法。

PHPDoc对此可能采取的一种方法是利用"@return$this"作为表示流利方法的约定,因为它与代码语法本身相匹配,因此非常清晰。我怀疑在标准本身包含这个用例之前,任何IDE都不会构建这种能力。

在短期内,我认为您多余的"ChildClass::say_hi(){parent::say_hit();}"可能会让IDE自动完成工作。同样,可能,因为自动完成也可以识别方法链接本身(例如$foo->bar()->baz()->roll()->tid();)可能不存在。

最新更新