2013-10-06 65 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

相關問題