2012-09-11 70 views
1

雖然這個問題一般在DocBlocks,我用例是關於PHP。文檔塊類類型的繼承

考慮下面的PHP代碼:

<?php 

class ParentClass { 
    /** 
    * Says 'hi' to the world. 
    * @return ParentClass Returns itself for chaining. 
    */ 
    public function say_hi(){ 
     echo 'hi'; 
     return $this; 
    } 
} 

class ChildClass extends ParentClass { 
    /** 
    * Says 'bye' to the world. 
    * @return ChildClass Returns itself for chaining. 
    */ 
    public function say_bye(){ 
     echo 'bye'; 
     return $this; 
    } 
} 

$c = new ChildClass; 
$c->say_hi()->say_b| <- type hinting won't suggest "say_bye" here 

?> 

這僅僅是一些鏈接一個簡單的類。擴展類放棄了類型提示,因爲父類'docblock正在使用不具有子類的方法/屬性的特定類名稱。

假設我們確實需要類型提示功能,(如果沒有,請你離開這個問題 - 我不想在這裏沒用參數),我應該怎麼解決這個問題?

我想出了以下可能性:

  • 更改PHPDoc的標準,允許一個特殊的關鍵字
  • 添加多餘say_hi()方法調用父只是重新聲明的docblock
  • 不要指定返回類型,讓IDE決定什麼return $this;的意思(這是否甚至工作?)

回答

2

你所描述的通常稱爲「流暢的inter面對「,所有對象的方法都在做他們的工作並返回對象本身。

我沒有親自見過該怎麼做正是敲定任何PHPDoc的方針。因此,我不知道任何IDE已經提供了一種自動完成功能來處理用例的方法。

是PHPDoc的將在這方面的一個可能的路徑是利用「@返回$此」是約定,表明流利的方法,因爲它匹配的代碼語法本身,因此是非常明確的。我懷疑任何IDE都會在標準本身包含這個用例之前構建這個功能。在短期內,我認爲你多餘的「ChildClass :: say_hi(){parent :: say_hit();}」可能讓你的IDE自動完成工作。再次,可能,因爲具有自動完成也認識方法本身鏈接(例如$ foo->巴() - >巴茲() - >輥() - >潮();)可能不存在。

+0

這似乎與Netbeans正常工作,雖然'@return $ this'會很方便... – Christian

+0

事實證明,phpDocumentor 2.x確實認識到「@return self」和「@return $ this」來實現方法是一種「流利」的方法。在生成的文檔中,它突出顯示了「Fluent Interface」方法,並調整了chlid class doc中顯示繼承父方法的返回類類型。 一旦穩定的2.0.0正式發佈,我猜的IDE將實現識別此語法。希望他們的自動完成邏輯能夠正確地進行「流利」識別和調整方法的繼承。 – ashnazg

2

就可以解決這個像這樣:

class ParentClass { 
    /** 
    * Says 'hi' to the world. 
    * @return static 
    */ 
    public function say_hi(){ 
     echo 'hi'; 
     return $this; 
    } 
} 

的「返回:靜態」語句允許你想要什麼,PhpStorm工作就好了吧。