【问题标题】:phpDoc notation to specify return type identical to parameter typephpDoc 表示法指定与参数类型相同的返回类型
【发布时间】:2013-10-13 01:27:46
【问题描述】:

想象一下以下假设的类结构,这不是一个非常罕见的场景,所有 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都能理解?

【问题讨论】:

    标签: php polymorphism phpstorm phpdoc late-binding


    【解决方案1】:

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

    @return BaseFilter|TextFilter|AnotherFilter
    

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

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

    【讨论】:

    • 那么关键是,如果我定义@return $filter,IDE 将确切知道我作为该参数传递的类型,因此可以将其填充。列出所有过滤器不是里面的选项一个框架,因为其他人可能会创建一个新框架。不过感谢您的输入:)
    • @return $filter 对 IDE 没有意义,因为 $filter 没有任何价值,除非代码实际运行
    • phpDocumentor 2.x 中流利方法中@return 的当前选项是“return self”、“return static”和“return $this”。当前的实现很简单,因为所有三个行为相同,但最终它们将意味着三个不同的东西。顺便说一句,我开始说我会通过执行“$x = new TextFilter(); $x->setMinLength(8); addFilter($x);”来完全避免这个问题,但我猜那只是外围问题:-)
    • @ashnazg 我确实知道额外的代码行可以解决这个问题,但是这种方式破坏了链接调用的意义:) 我可能应该建议将其添加到 phpDoc 标准中。
    • @MarkBaker 这是不正确的——当我调用$myClass->addFilter(new TextFilter()) 时,IDE 非常清楚$filter 中的多态类型是什么。因此,它也可以很好地正确解析@return $filter,如果无法从上下文中确定更精确的类型,则回退到BaseFilter,因为它已经在由于缺少文档或上下文而导致确切类型不清楚的所有其他情况下.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2022-01-03
    • 2019-12-23
    • 1970-01-01
    • 2018-04-06
    • 2020-05-26
    • 2018-01-16
    相关资源
    最近更新 更多