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


81

메모장 ++ 및 숭고한 코딩으로 수년간 행복한 시간을 보낸 후 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).

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


1
누구도 무시 _call하는 것이 좋은 생각이라고 생각 할까요? !!
Brian Gordon

정상인이이 질문을 찾을 경우 Brian의 댓글을 +1했습니다. 매직 메서드는 모든 의도와 목적을위한 것입니다. 문서화 할 수 없음 (매직 메서드에 a (n) [parameter | precondition | postcondtion | exception] 문서화 시도), IDE 친화적이지 않음 (매직 메서드 단계 디버그 시도), 리팩토링에 탄력적 임 (종료 된 소프트웨어에서 마법의 방법을 리팩토링하는 것을 고려하지 마십시오), LAZY (좋아, 마지막 것은 의견으로 해석 될 수 있습니다).
Luke A. Leber

17
-1 @LukeA. Leber의 의견에 비전이 부족하다는 것을 증명합니다. 매직 메서드는 적은 코드를 작성하는 방법이 아니지만 (게으르게 사용하는 경우), 매직 메서드는 아키텍처를 가능하게하여 단순하지 않거나 너무 복잡하여 작성할 가치가 없습니다. 그리고 PHPDoc을 사용할 때 완전히 IDE 친화적입니다. 대부분의 경우 매직 메소드가 필요하지 않지만 필요할 때 대체 (PHP에서는)가 없습니다. 그것들을 사용하여 매우 구조화 된 방식으로 사용하는 것은 완전한 유효한 솔루션입니다.
MikeSchinkel 2017

5
재정의 __call가 나쁜 생각 이라고 생각하지 마십시오 . 구현에 관한 것입니다. 위의 질문에 표시된 구현은 확실히 최선의 방법은 아니지만 체인 가능한 API의 경우 많은 유연성을 허용합니다.
Steve Bauman

답변:


144

클래스 수준 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에 가져올 수있는 도움이 거의 없음) :


2
고마워, 이것은 합리적인 제안처럼 보이며 확실히 phpStorm에서 작동하지만 각 클래스의 상단에 잠재적으로 수백 줄의 @method를 작성하는 것이 약간 싫습니다. get_by_ * 메소드는 지정된 매개 변수로 해당 유형의 객체를 가져 오기 위해 모든 객체 매개 변수를 앞에 붙일 수 있습니다. get_by_ _and_ 의 가능성을 제외하더라도 @methods140 개의 서로 다른 클래스에 걸쳐 약 1500 개로 끝날 것입니다 . 문서를 제공하는보다 일반적인 방법이 없습니까?
Rob Forrest

아니요. 모든 매직 메소드는 구체적으로 선언되어야합니다 (이것이 이러한 방식으로 문서화하는 주요 포인트입니다)-PHPDoc은 부분 이름을 이해하지 못합니다 (예 :) get_by_*(int $id). IDE (코드 검사, 완료가 아님!)의 경우 대체 솔루션 (경고 비활성화)이 있습니다. phpDocumentor (또는 대체 도구)-나에게 알려진 해결책이 없습니다 (아마도 거기에 있지만 그것에 대해 모릅니다). github에 대한 링크가 있습니다. 새 티켓을 제출하고 이러한 "부분 이름"일치 기능을 추가하도록 요청합니다. 그들이 말하는 내용을 확인하십시오 (거부 될 가능성이 높습니다). 구현 될 경우 IDE도 나중에 사용할 수 있습니다.
LazyOne 2013 년

github.com/phpDocumentor/phpDocumentor2/issues- 그러나 귀하의 티켓을 게시하기 전에 유사한 티켓이 존재하지 않는지 확인하십시오.
LazyOne 2013 년

모두 감사합니다. 이와 관련하여 현재 열려있는 티켓이 있지만 모두 조용해진 것 같습니다. 나는 거기에 코멘트를 붙였고 우리는 그 결과를 볼 것입니다.
롭 포레스트

2
참고로 phpDocumentor의 티켓 (다른 사용자가 당신이 말하는 티켓이 무엇인지 알 수 있고 답변 자체에 추가했습니다) : github.com/phpDocumentor/phpDocumentor2/issues/689
LazyOne

4

원래 질문과 다소 관련이 있음 :

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 할 필요가 없습니다.

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


이것은 __call에서 작동하지 않습니다. 또한 문서화되지 않았고 유효하지 않은 PHP입니다. PHPStorm은 입력에 따라 혼합 유형을 반환하는 정적으로 정의 된 메서드가있는 경우에만 지원을 제공합니다.
jgmjgm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.