2012-04-05 67 views
1

我有一個用PHP編寫的領域模型,我的一些類(聚合中的實體)有公共方法,絕不應該從聚合之外調用。PHPDoc/PHPStorm中是否存在@visibility包概念?

PHP沒有可見性方案,所以我不知道是否有某種標準化的方式在文檔塊定義@package@visibility package,並有一個靜態分析工具,將報告違規行爲的能見度範圍。

我目前正在嘗試PHPStorm,目前爲止我發現它非常好,所以我想知道這個軟件是否支持這個功能。如果沒有,你知道任何靜態代碼分析工具嗎?

回答

0

到目前爲止,PHPStorm似乎並未提供此功能。

0

與我在PHP的功能中看到的這種思路最接近的是,對於這些類型的方法,使用「protected」範圍而不是public。當然,這需要使用繼承來授予對受保護項目的訪問權限。在我管理phpDocumentor的幾年中,我從來沒有遇到過任何其他嘗試模仿我從Java時代就記得的那種「包範圍」的東西。

+0

當我談論*聚合*時,它們實際上是由幾個對象組成的,它們必須通過公共方法進行通信。我意識到PHP的侷限性,而不是試圖真正模仿Java,只是試圖提示PHP代碼分析工具,以便它可以報告我的類的潛在錯誤用法! – Benjamin 2012-04-09 20:18:21

0

如果您的聚合根中的實體在不經過聚合根的情況下不應該修改,那麼唯一的意思就是您必須控制該實體,使該實體成爲私有或受保護的成員,以便對該實體的所有修改都必須去通過聚合。

class RootEntity { 
    private $_otherEntity; 
    public function DoSomething() { 
     $this->_otherEntity->DoSomething(); 
    } 
    public function setOtherEntity(OtherEntity $entity) { 
     $this->_otherEntity = $entity; 
    } 
} 

有人仍然總是可以做:

$otherEntity = new OtherEntity(); 
$otherEntity->DoSomethingElse(); 
$rootEntity->setOtherEntity($otherEntity); 

雖然,我想你可以使用魔法__call()方法來禁止_otherEntity的設置,除了在施工期間的任何地方。這屬於總黑客類:)下

class RootEntity { 
    private $_otherEntity; 
    private $_isLoaded = false; 

    public function __call($method, $args) { 
     $factoryMethod = 'FactoryOnly_'.$method; 
     if(!$this->_isLoaded && method_exists($this,$factoryMethod) { 
      call_user_func_array(array($this,$factoryMethod),$args 
     } 
    } 
    public function IsLoaded() { 
     $this->_isLoaded = true; 
    } 
    protected function FactoryOnly_setOtherEntity(OtherEntity $otherEntity) { 
     $this->_otherEntity = $otherEntity; 
    } 
} 

所以,從那裏,當你建立了對象,你可以從你的工廠或倉庫調用$ AGG-> setOtherEntity($ otherEntity)。然後,當您完成構建對象時,調用IsLoaded()。從那裏起,沒有其他人能夠在班級中引入新的OtherEntity,並且必須使用公開可用的方法。

我不確定您是否可以稱這是一個「好」的答案,但這是我能想到的真正限制訪問某個實體內的實體的唯一方法。

[編輯]:另外,忘了提...最近的文件是存在於PHPDoc的一個@internal: http://www.phpdoc.org/docs/latest/for-users/tags/internal.html

我懷疑這是否將修改IDE的代碼完成,但是。雖然,您可能可以創建一個公共函數/屬性,但可以使用phpdoc將其標記爲「@access private」,以避免代碼完成。

+0

@internal可能是解決方案,但是迄今爲止,它仍然不受支持! – Benjamin 2012-11-22 19:26:01