2017-12-06 1 views
0

PHPDoc 인라인 @var 올바른 유형을 설정하기 위해 마법 필드 변수를 정의하려고하지만 IDE가 자동 완성 기능을 사용하지 않습니다.마법 필드가있는 IntelliJ/PhpStorm 인라인 @var

"마법 필드를 통해 접근하는 필드"를 보여줍니다. 검사 설정에서 제거하려고했지만 경고가 표시되지 않고 계속 자동 완성되지 않습니다. 나는 새로운 변수를 정의하면 작동됩니다

/** @var \NameSpace\SomeClass $this->field */ 
$this->field->someMethod(); // Not auto-completing 

/** @var \NameSpace\SomeClass $this::field */ 
$this->field->someMethod(); // Not auto-completing 

반면의 경우 :

내가 성공하지 않고 다른 방법을 시도

$field = $this->field; 

/** @var \NameSpace\SomeClass $field */ 
$field->someMethod(); // Auto-completing correctly 

누군가는 자동을 작동하도록하는 방법을 알고 새로운 변수를 정의하지 않고 기능을 완성합니까? 가능한가?

업데이트 : $ field는 (는) 항상 주 클래스의 동일한 클래스가 아니므로 @property 특성을 사용할 수 없습니다.

+1

새로운 변수가 가장 좋습니다. 그것의 사용법은 국부적으로 체재한다, 그래서 짐의 다량이 아니다. – ashnazg

답변

2

클래스 수준의 PHPDoc 코멘트에 @property 태그를 사용하여 입력해야합니다.

https://docs.phpdoc.org/references/phpdoc/tags/property.html


/** @var \NameSpace\SomeClass $this->field */ 

/** 
* My special class 
* 
* @property \NameSpace\SomeClass $field Optional my magical variable description 
*/ 
class MySpecialClass { 
.... 

이 작동하지 않습니다 - 당신은 인라인 @var를 사용하여 2 레벨의 변수/요소 ( $this->field)에 대한 typehint를 제공 할 수 없습니다. 첫 번째 레벨 엔티티 만 유형을 지정할 수 있습니다.

+0

내 문제는 $ 필드가 항상 같은 클래스는 아닙니다. 그렇다면 새 $ var를 정의하지 않고는 불가능합니다. 고맙습니다. –

+1

현재 클래스에서 다시 선언하십시오 (액세스하려면'$ this'를 사용하고 있으므로 완료 할 수 있습니다). 만약 다른 클래스 ('$ something-> field')에서 접근한다면 .. 중간 변수 (타입 힌트를 사용할 수있는 지역 변수에 할당) 만 사용해야합니다. – LazyOne

-1

인라인 @var (thank to @LazyOne)을 사용하여 2 차 변수/요소 ($ this-> field)에 유형 힌트를 제공 할 수 없습니다.

그래서 가능한 솔루션은 메인 클래스에서 사용하는 모든 클래스와 @property 설정됩니다 :이 방법으로

/** 
* My special class 
* 
* @property \NameSpace\SomeClass|OtherSomeClass|OneMore $field 
*/ 
class MySpecialClass { 

에게 마법 필드 $field를 자동으로 완성 정의 된 모든 클래스의 모든 방법이 될 것입니다.

+0

@Downvoter 이유가 무엇입니까? –

+0

* "\ NameSpace \ SomeClass | OtherSomeClass | OneMore $ field"* 왜 이렇게합니까? 왜 여기에 모든 사건을 나열해야합니까? 내일 또 다른 5 개의 수업을 추가해야 할 경우 내일 무엇을 할 것인가? 그것은 단지 전반적인 나쁜 접근 방식입니다. (기억해보십시오 - IDE는이 모든 클래스의 메소드/필드를 결합합니다 ... 매우 예상치 못한 결과와 편집기 속도 저하를 가져올 수 있습니다) – LazyOne

+0

물론 ... 목록이 2-3 클래스 길이 인 경우에만 - - 충분히 잘 작동 할 것입니다. 하지만 클래스의 긴 목록이 될 경우 .. 또는 그들은 같은 서명 있지만 다른 서명이있을 것입니다 - 전혀 (전혀 당신과 IDE). 이러한 복잡한 경우에는 쉽게 입력 할 수있는 지역/중간 변수를 사용하는 것이 좋습니다.그러한 필드에 매우 자주 액세스하고 피곤한 경우 (원하지 않음) 항상 형식 힌트를 사용하십시오. 적절한 형식 힌트를 반환하고 사용하는 특별한 로컬 메서드 인 getField()를 각 클래스에 더 잘 소개하는 것이 좋습니다. – LazyOne