2012-04-05 5 views
1

PHP로 작성된 도메인 모델이 있고 일부 클래스 (집계에있는 엔터티)에는 공용 메서드가 있습니다.이 메서드는 집계 외부에서 호출하면 안됩니다.PHPDoc/PHPStorm에 @visibility 패키지 개념이 있습니까?

PHP는 패키지 가시성 개념을 가지고 있지 않기 때문에 docblocks에 @package@visibility package을 정의하는 표준화 된 방법의 일종이 있는지 궁금 하군요 및 위반을보고 할 정적 분석 도구를 가지고 가시 범위.

저는 현재이 소프트웨어가이 기능을 지원하는지 궁금합니다. 지금까지 매우 좋은 것으로 밝혀진 PHPStorm을 시험 중입니다. 그렇지 않다면 정적 코드 분석 도구를 알고 있습니까?

답변

0

지금까지 PHPStorm은이 기능을 제공하지 않는 것 같습니다.

0

PHP의 기능에서 볼 수있는 생각과 가장 유사한 점은 이러한 종류의 메소드에 공개가 아닌 "보호 된"범위를 사용한다는 것입니다. 물론 보호 된 항목에 대한 액세스 권한을 부여하기 위해 상속을 사용해야합니다. 필자는 phpDocumentor를 관리하면서 필자의 Java 시대에서 기억하고있는 "패키지 범위"를 모방하려는 시도를 한 번도 경험하지 못했습니다.

+0

* 집합체 *에 대해 이야기 할 때 실제로 여러 객체로 구성되어 있으며 공용 메서드로 서로 통신해야합니다. 나는 PHP의 한계를 잘 알고 있고, 자바를 실제로 모방하려는 것이 아니라 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를 도입 할 수 없으며 집계에서 공개적으로 사용 가능한 메소드를 사용해야합니다.

"좋은"대답이라고 부를 수 있는지 확실하지 않지만 집계 안의 엔티티에 대한 액세스를 정말로 제한하기 위해 생각할 수있는 유일한 방법입니다.

[편집] : 그러나, http://www.phpdoc.org/docs/latest/for-users/tags/internal.html

나는 그것이 IDE의 코드 완성을 수정합니다 의심 : 또한, ... 문서의 가장 가까운하는 PHPDoc에 대한 @internal이 있음을 언급하는 것을 잊었다. 하지만 공용 함수/속성을 만들 수도 있지만 "@access private"이라는 레이블을 phpdoc로 지정하여 코드 완성을 막을 수 있습니다.

+0

@ 내부는 해결책 일 수 있지만 현재까지는 지원되지 않습니다! – Benjamin

관련 문제