2012-04-05 6 views
1

私はPHPで書かれたドメインモデルを持っていて、私のクラス(集合体内の実体)の中にはパブリックな方法があります。PHPDoc/PHPStormに@visibilityパッケージのコンセプトはありますか?

PHPはパッケージ可視性の概念がありませんので、コメントブロックに記述@package@visibility packageを定義するための標準化された方法のいくつかの種類がある場合、私は思ったんだけど、との違反を報告する静的解析ツールを持っています可視性の範囲。

私は現在、これまで非常に良いと感じていたPHPStormを試しています。このソフトウェアがこの機能をサポートしているかどうかは疑問です。もしそうでなければ、静的コード解析ツールを知っていますか?

答えて

0

これまでのところ、PHPStormはこの機能を提供していないようです。

0

PHPの能力に見られるこの考え方に最も近いのは、この種のメソッドには公開されていない「保護された」スコープを使用することです。許可するには、保護されたアイテムへのアクセスを許可するために継承を使用する必要があります。私のphpDocumentorの管理では、私がJavaの日々から覚えているような "パッケージスコープ"のようなものをまねしようとしたことはありませんでした。

+0

私は*集約*について言及していますが、実際にはいくつかのオブジェクトで構成されています。これらのオブジェクトはパブリックメソッドで一緒に通信する必要があります。私はPHPの限界を認識していて、Javaを真似しようとしないで、PHPコード解析ツールをヒントしてクラスの間違った使用を報告できるようにしようとしています。 – Benjamin

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); 

けれども、私はあなたがどこにでも建設中以外_otherEntityの設定を禁止する魔法の__call()メソッドを使用することができると思います。これは、総ハックのカテゴリに該当:)

ので
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を導入することができず、公に利用可能なメソッドを集約で使用する必要があります。

「良い」答えを呼ぶことができるかどうかはわかりませんが、集合体内のエンティティへのアクセスを真に制限することが考えられるのは唯一のことです。

[EDIT]:また、言及するのを忘れてしまった...ドキュメントの最も近いphpdocのため@internalがあるということです。 http://www.phpdoc.org/docs/latest/for-users/tags/internal.html

私はそれはしかし、IDEのコード補完を修正することを疑います。しかし、あなたはおそらくpublic function/propertyを作ることができますが、コード補完を避けるためにphpdocを使って "@access private"というラベルを付けることができます。

+0

@内部は解決策になる可能性がありますが、現在までサポートされていません。 – Benjamin

関連する問題