PHPStorm 의 attributes(특성) 지원 기능으로 소스 코드 품질 올리기
개요
PHPStorm 에서는 코드 자동 완성과 정적 분석을 더 잘하게 하기 위해서 몇 가지 Attribute 를 지원하고 있습니다.
이 기능들을 잘 사용하면 코드를 실행하지 않아도 IDE 에서 문제가 될 코드를 잡아낼 수 있습니다.
Attribute 는 PHP 8 부터 사용할 수 있습니다.
설치는 다음 명령을 이용해서 하면 됩니다
composer require --dev jetbrains/phpstorm-attributes
특성 종류
#[Deprecated]
나중에 deprecated 될 기능이 있을 경우 사용자에게 통지하기 위해서 이 attribute 를 사용하면 됩니다.
reason 에는 deprecated 되는 이유를 적고 replacement 에는 제안하는 대체 방법을 써주면 됩니다.
예로 Symfony 는 5.2 부터 PHP 8 을 풀로 지원하며 deprecated 된 메서드인 \Symfony\Component\DependencyInjection\Alias::setPrivate() 에 다음 attriibute 가 적용되어 있습니다.
#[Deprecated( reason: 'since Symfony 5.2, use setPublic() instead', replacement: '%class%->setPublic(!%parameter0%)' )]
#[ArrayShape]
PHP 의 array 를 사용할 경우 key 의 무결성을 체크해 주는 특성입니다.
#[ArrayShape([ // ‘key’ => ’type’, ‘key1’ => ‘int’, ‘key2’ => ‘string’, ‘key3’ => ‘Foo’, ‘key3’ => App\PHP 8\Foo::class, ])] function functionName(...): array
이제 다음과 같이 존재하지 않는 키인 key4 에 접근할 경우 IDE 에서 감지하고 에러를 발생시키므로 실수를 방지할 수 있습니다.
$r = functionName(); $r['key4'] = 'some value'; // IDE 에러
#[Immutable]
property 나 class 가 생성되거나 초기화된 후 변경할 수 없음을 표시하며 만약 변경할 경우 에러가 발생합니다.
#[Immutable] class DTO { public string $val; public function __construct(string $val) { $this->val = $val; } }
dto 객체를 생성하고 property 에 값을 할당할 경우 에러가 납니다.
$d = new DTO(); $d->val = 'some value'; // 에러
#[Pure]
함수에 Pure attribute 를 사용하면 이 함수는 어떤 side effect 도 발생하지 않음을 의미합니다.
use JetBrains\PhpStorm\Pure; #[Pure] function compare(Foo $a, Foo $b): int { return $a->a <=> $b->b; }
Pure function 을 불필요하게 호출할 경우 PHPStorm 에서는 불필요한 호출을 감지할 수 있습니다. 예로 pure function의 return 을 사용하지 않을 경우 경고를 표시합니다.
만약 Pure 가 붙은 함수안에서 side effect 를 발생시키면 경고를 표시합니다.
use JetBrains\PhpStorm\Pure; class Foo { public int $val; } #[Pure] function add(Foo $a, Foo $b) : int { $a->val = 1; return $a->val + $b->val; }
#[ExpectedValues]
함수가 어떤 파라미터 값(type 이 아닌 value)을 허용하는지를 기술할 수 있습니다.
enum 을 사용하지 않고 define 한 변수를 사용할 경우 이 attribute 로 허용하는 변수의 값들을 제한하여 실수를 방지할 수 있습니다.
function my_count( array|\Countable $var, #[ExpectedValues([COUNT_NORMAL, COUNT_RECURSIVE])] int $mode = COUNT_NORMAL ){}
#[NoReturn]
Attribute의 이름을 봐서는 함수의 리턴값이 없다고 오해할 수 있는데 return type 을 void 로 설정한 것과 다릅니다. 이 attribute는 함수에서 exit() 같이 script 실행을 중지하는 구문을 호출한다는 의미입니다.
이 특성을 사용하면 app 의 control flow 분석해서 도달하지 못하는 죽은 코드를 표시해 줍니다.
use JetBrains\PhpStorm\NoReturn; class MyApplication { #[NoReturn] public function terminate(): void { exit(); } public function run(): void { echo "Hello World"; $this->terminate(); echo "Bye"; // 도달하지 못함 } }
#[Language]
소스 코드 문법 강조나 더 나은 정규식 검증등 PHPStorm 이 더 잘 동작하기 위해서 사용하는 attribute 입니다..