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 입니다..

Ref