IDE의 매직(_call 및 _callStatic) 메서드를 문서화하는 방법

메모장++와 숭고함으로 코딩하는 행복한 세월을 보낸 후, PHP IDE를 시도해 보라는 조언을 받았습니다.phpStorm을 사용해보고 있는데 괜찮은 것 같아요.코드 완성이나 문서화는 매우 좋은 기능이지만, 마법의 방법을 사용하면 잘 되지 않습니다.phpStorm이 마법의 메서드에서 무슨 일이 일어나고 있는지 이해시키기 위한 작업이 있습니까?

우리의 상황은 다음과 같습니다.

abstract class a {
public static function __callStatic($method,$args)
{
if(strpos($method,"get_by_") === 0)
{
 //do stuff
} elseif(strpos($method,"get_first_by_") === 0) {
 //do stuff
} elseif($method == "get_all") {
 //do stuff
}
} }
class b extends a {
// some more stuff }
b::get_by_user_id(27); b::get_first_by_id(156); b::get_all(); 

magic callStatic 메서드를 사용하면 함수 호출을 구성하는1개 이상의 인수를 통해 오브젝트 컬렉션을 얻을 수 있습니다.

이러한 경우에 사용하는 @method 문이 있는 것을 알 수 있습니다만, phpStorm은 이러한 문 중 첫 번째 문만 선택합니다.또한 반환 타입은 mixed로 설정할 수 있습니다.이 클래스는 어떤 클래스(예에서는 b)로 설정할 수 있으면 좋겠습니다.

어떤 아이디어나 제안도 매우 감사하게 받아들여질 것입니다, 감사합니다.



질문에 대한 답변



클래스 레벨의 PHPDoc 코멘트(특히 @method 태그)를 사용해 주세요.PhpStorm에서는 정상적으로 동작합니다.

/**
* @method static someClass get_by_user_id(int $id) Bla-bla
* @method static someClass get_first_by_id(int $id)
*/ abstract class a { ... 

위의 경우:

  • @method— PPDoc 태그
  • static–이것은 스태틱 방식임을 나타냅니다.
  • someClass또는$this— 리턴 타입
  • get_by_user_id— 메서드명
  • (int $id)— 메서드 시그니처:([[type] [parameter]<, ...>])
  • Bla-bla— 일부 옵션 설명

상세 정보@method:

추신: while@method staticPhpStorm에서는 정상적으로 동작합니다(IDE에서는 메서드가 스태틱하다고 합니다).실제 php Documentor 툴에서는 지원되지 않을 수 있습니다(죄송합니다만, 한동안 사용하지 않았습니다).


또는 (물론 PhpStorm에서)Settings Inspections PHP Undefined Undefined method --> Downgrade severity if __magic methods are present in class— 이러한 메서드의 코드 완성에는 전혀 도움이 되지 않지만, 이러한 매직 메서드를 「메시지」에러라고 마크 하는 일은 없습니다.


phpDocumentor의 RegEx/partial name 사용에 관한 티켓@property/@method태그(문서에 도움이 되는 방법 및 코드 완성 시 실제 IDE에 대한 도움이 거의 없음):




원래 질문과 다소 관련이 있습니다.

phpstorm 메타 파일에서도 정의할 수 있습니다.공장 출하시 방법(v2016.3)의 예를 다음에 나타냅니다.

// Define in .phpstorm.meta.php namespace PHPSTORM_META {
$STATIC_METHOD_TYPES = [
Factory::create('') => [],
]; }
// Then use in code $factory = new Factory(); $user = $factory->create(User::class); // Here you get autocomplete. $user->subscribe(); 

이렇게 하면 마법이 일어났을 때 모든 가능성을 문서화할 필요가 없습니다.

자세한 내용은 문서를 참조하십시오.