2013-10-06 79 views
2

想象一下下面的假想类的结构,而不是与所有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中可以理解?

回答

2

大概一个IDE可以在这里做的最好的是,如果你对addFilter()方法实际上@return列出的所有可能返回的可能BaseFilter孩子:

@return BaseFilter|TextFilter|AnotherFilter 

可能触发你的IDE到提供所有可能的返回类的所有可能的方法。这取决于正在使用的IDE是否知道如何识别可能的返回类型的列表。很显然,这会让你感到乏味,但是把这样的列表放在很多返回标签中。

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

+1

那么问题是,如果我定义'@return $ filter',IDE会准确知道我传递的参数类型是否已经作为该参数传递过来,因此可以填充它。列出所有过滤器不是框架内的选项因为别人可能会创建一个新的。感谢您的输入:) –

+0

'@return $ filter'对IDE没有意义,因为$ filter没有值,除非代码实际运行 –

+0

phpDocumentor 2.x for @return中流行方法的当前选项是“返回自我“,”返回静态“和”返回$ this“。目前的实施很简单,因为三者都是相同的,但最终它们意味着三件不同的事情。顺便说一下,我开始说我会完全避免这个问题,做“$ x = new TextFilter(); $ x-> setMinLength(8); addFilter($ x);”,但我猜测那只是一个外设问题:-) – ashnazg

相关问题