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
:
- http://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html
- https://github.com/phpDocumentor/phpDocumentor2/blob/develop/docs/PSR.md#711-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에 가져올 수있는 도움이 거의 없음) :
원래 질문과 다소 관련이 있음 :
You can also define this in phpstorm meta file. Here's an example for factory method (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();
This way you don't have to docblock every possibility when magic happens.
Have some docs for details.
'Development Tip' 카테고리의 다른 글
텍스트 편집을 위해 왼쪽 및 오른쪽 화살표 키의 속도를 높이는 방법은 무엇입니까? (0) | 2020.10.16 |
---|---|
Line break (like ) using only css (0) | 2020.10.16 |
Android Studio를 시작 화면으로 강제 시작하는 방법은 무엇입니까? (0) | 2020.10.16 |
JSONP를 사용할 때 jQuery $ .getJSON (또는 데이터 유형이 'jsonp'로 설정된 $ .ajax) 오류를 어떻게 포착합니까? (0) | 2020.10.16 |
회전을 제대로 처리하는 iPhone 용 뷰포트 메타를 설정하는 방법은 무엇입니까? (0) | 2020.10.16 |