[php] 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();

마법의 callStatic 메서드를 사용하면 함수 호출을 구성하는 하나 이상의 인수를 통해 개체 컬렉션을 가져올 수 있습니다.

이 경우에 사용할 @method 문이 있지만 phpStorm은이 문 중 첫 번째 문만 선택합니다. 또한 이것이 호출 된 클래스로 설정할 수 있기를 원할 때만 반환 유형을 혼합으로 설정할 수 있습니다 (예에서는 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 -PHPDoc 태그
  • static -이것이 정적 메서드임을 알려줍니다.
  • someClass또는 $this-반환 유형
  • get_by_user_id -분석법 이름
  • (int $id) -메소드 서명 : ([[type] [parameter]<, ...>])
  • Bla-bla -일부 선택적 설명

추가 정보 @method:

추신 :@method static PhpStorm에서 잘 작동
하지만 (IDE에 방법이 정적이라고 말함) 실제 phpDocumentor 도구에서 지원하지 않을 수도 있습니다 (죄송합니다. 한동안 사용하지 않았습니다).


대안 : (물론 PhpStorm에서) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class-어떤 식 으로든 이러한 메서드에 대한 코드 완성에는 도움이되지 않지만 이러한 매직 메서드는 “정의되지 않은 메서드”오류로 표시되지 않습니다.


@property/ @method태그에 대한 RegEx / 부분 이름 사용에 관한 phpDocumentor의 티켓 (문서화에 유용 할 수있는 방법과 코드 완성을 처리 할 때 실제 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();

이렇게하면 마법이 발생할 때 모든 가능성을 docblock 할 필요가 없습니다.

일부이 문서 자세한 내용을.


답변