5

想象一下以下假设的类结构,这不是一个非常罕见的场景,所有 PHPdoc 提示都正确设置:

class BaseFilter {
  /** ...base methods... */
}

class TextFilter extends BaseFilter {
  public function setMinLength($len)
  {
    /** ...irrelevant */
  }
}

class SomethingWithFilters
{
  /**
   * @param BaseFilter $filter A valid filter to be added.
   * @return BaseFilter The filter that was added for easy chaining
   */
  public function addFilter(BaseFilter $filter)
  {
    $this->filters[] = $filter;
    return $filter;
  }

  /** @var BaseFilter[] A list of filters */
  private $filters = [];
}

现在我使用此代码如下:

$myClass = new SomethingWithFilters();
$myClass->addFilter(new TextFilter())->setMinLength(8);

在 phpStorm(可能还​​有大多数其他 IDE,因为它是有意义的)中,第二行会产生一个警告,指出它BaseFilter不包含方法setMinLength。虽然绝对正确,但这是有意的多态行为,充分利用了 PHP 的后期绑定特性——在像 C# 这样的语言中,您必须显式地向上转换。因此,我希望 phpDoc 语法在这里支持某种动态表示法,说明返回类型addFilter与提供的类型相同$filter

我尝试将其更改为:

@return $filter

但这只是作为参考出现BaseFilter并被视为这样,仍然发出警告。

有没有什么标准化的方式来达到这个效果,至少普通的IDE都能理解?

4

1 回答 1

2

如果您在 addFilter() 上的 @return 实际上列出了所有可能返回的 BaseFilter 子项,那么 IDE 在这里可以做的最好的事情可能是:

@return BaseFilter|TextFilter|AnotherFilter

可能会触发您的 IDE 为所有可能的返回类提供所有可能的方法。这取决于使用的 IDE 是否知道如何识别这样的可能返回类型列表。显然,这对您来说会变得乏味,将这样的列表放在许多返回标签中。

我不知道有任何 IDE 会单独查看 BaseFilter 的返回类型,生成所有可能的父+子方法的列表,从而使整个列表可用于自动完成自动完成。

于 2013-10-07T16:33:34.207 回答