4

虽然这个问题一般是关于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;意思(这甚至可以工作吗?)
4

2 回答 2

5

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

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

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

于 2013-10-25T13:52:34.370 回答
2

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

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

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

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

于 2012-09-12T14:48:50.897 回答