【发布时间】: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