想象一下下面的假想类的结构,而不是与所有PHPDoc的一种极为罕见的情况下提示的设置正确: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中可以理解?
那么问题是,如果我定义'@return $ filter',IDE会准确知道我传递的参数类型是否已经作为该参数传递过来,因此可以填充它。列出所有过滤器不是框架内的选项因为别人可能会创建一个新的。感谢您的输入:) –
'@return $ filter'对IDE没有意义,因为$ filter没有值,除非代码实际运行 –
phpDocumentor 2.x for @return中流行方法的当前选项是“返回自我“,”返回静态“和”返回$ this“。目前的实施很简单,因为三者都是相同的,但最终它们意味着三件不同的事情。顺便说一下,我开始说我会完全避免这个问题,做“$ x = new TextFilter(); $ x-> setMinLength(8); addFilter($ x);”,但我猜测那只是一个外设问题:-) – ashnazg