phpDoc表示法指定与参数类型相同的返回类型

Nie*_*jes 5 php polymorphism phpdoc late-binding phpstorm

想象一下以下假设的类结构,而不是一个非常罕见的场景,所有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 = [];
}
Run Code Online (Sandbox Code Playgroud)

现在我使用以下代码:

$myClass = new SomethingWithFilters();
$myClass->addFilter(new TextFilter())->setMinLength(8);
Run Code Online (Sandbox Code Playgroud)

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

我尝试将其更改为:

@return $filter
Run Code Online (Sandbox Code Playgroud)

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

是否有任何标准化的方法来实现这种效果,至少通用IDE可以理解它?

ash*_*azg 2

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

@return BaseFilter|TextFilter|AnotherFilter
Run Code Online (Sandbox Code Playgroud)

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

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

  • @MarkBaker,这是不正确的 - 当我调用 `$myClass->addFilter(new TextFilter())` 时,IDE 非常清楚 `$filter` 中的多态类型是什么。因此,它也可以很好地正确解析“@return $filter”,如果无法从上下文中确定更精确的类型,则回退到“BaseFilter”,就像在由于缺失而不清楚确切类型的所有其他情况下一样。文档或上下文。 (3认同)