메모장 ++ 및 숭고한 코딩으로 수년간 행복한 시간을 보낸 후 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
:
- https://docs.phpdoc.org/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에 가져올 수있는 도움이 거의 없음) :
답변
원래 질문과 다소 관련이 있음 :
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 할 필요가 없습니다.
일부이 문서 자세한 내용을.