2012-11-26 43 views
2

有什麼,爲什麼讓我的IDE(實際上PHPStorm)瞭解到:用於子類中流暢接口的PHPDoc?

$student->setName('Marco'); 

會(僅在增加PHPDoc的評論)返回Student一個實例,沒有在子類中重新定義setName()

class Person 
{ 
    private $name; 

    /** 
    * @param string $name 
    * @return Person 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 
} 

class Student extends Person { } 
+0

供參考:上面的「功能」應該是「功能」。我試圖將其作爲編輯提交,但同行評議者拒絕了,並表示我應該添加此評論作爲評論。 –

+0

@LS編輯感謝 – gremo

回答

4

你可以在你的docblock返回$的這個代替人評論

4

你必須重寫你的方法標籤作爲這樣

/** 
* @method Student setName($name) 
*/ 
class Student extends Person { } 
+0

好吧,這似乎工作,但這將是一個痛苦,許多制定者。 – gremo

+1

@Gremo yes ..... – silly

+0

您是否有在Student中的公共方法,您希望通過流利Person方法返回的對象訪問?如果沒有,並且您只需要能夠看到Person的所有方法,那麼希望IDE已經能夠顯示它們。但是,如果你在Student中有公開的方法,那麼你還沒有在Person中定義過,也許對於你的API來說,你可以在Person中聲明它們,但是它們是抽象的。像這樣,它們在Person API上(由Student繼承),僅在Person中記錄,並且如果流暢方法全部顯示@return Person,對於IDE仍然可見。 – ashnazg

0

根據我的經驗,我發現它有用採用組合的方式。我的IDE(帶有PHP插件的IntelliJ IDEA)抱怨說我的流暢方法返回$this,此時該值被用作另一個方法調用的參數。通過改變PHPDoc的註釋是:

/** 
* @param string $name 
* @return $this|Person 
*/ 

的IDE是快樂和PHPDoc的是爲用戶提供更多的信息。

順便說一下,通過說方法在PHPDoc中返回$this,這是一個非常好的指示,表明該方法正在實現流暢的接口。說它返回Person,雖然技術上準確,並不一定表明流利。例如,創建一個對象並返回它的方法也可以使用相同的註釋,但它不會流利。