실무에서 많이 사용하는 위주로 콕 집어서 정리해보았다

어트리뷰트 (Attribute)

코드를 선언할 때 메타 정보를 추가할 수 있도록 지원을 한다.

이 때 어트리뷰트의 정보는 리플렉션 API 를 통해서 접근할 수 있다.

#[Attribute]
class Bar {}

class Foo 
{
    #[Bar]
    public function barTest()
    {
        // ...
    }
}

열거형 (Enum)

PHP에는 그동안 열거형이 없어서 클래스와 상수를 통해 사용을 해왔는데 드디어

용도에 맞게 사용할 수 있는 타입이 생겼다.

기초

기본적으로 열거형은 다음과 같이 선언이 가능하다.

enum HttpMethod
{
    case GET;
    case POST;
    case PULL;
    case PATCH;
    case DELETE;
}

열거형 타입으로 HttpMethod 를 선언하고 http method로 사용이 가능한

5가지 허용된 값으로 HttpMethod::GET, HttpMethod::POST … 그 외

직접 사용하거나 변수에 할당해서 사용하는 것이 가능하다.

지원 열거형

위에서 본 열거형과 달리 직렬화 해야 하는 경우에 열거형에 기본값을 넣어서 더 유용하게 사용할 수 있다.

enum ApiVersion: string
{
    case VERSION_1 = 'v1';
    case VERSION_2 = 'v2';
    case VERSION_3 = 'v3';
}

이 지원 열거형은 intstring과 함께 사용할 수 있다.

다만 int|string과 같이 동시에 둘을 지원할 수는 없다.

?-> null 안전 연산자

PHP 8.0에 들어서면서 널 병합 연산자 '??'를 많이 사용하였는데 거기에 더해

null에 안전하게 프로퍼티와 메소드에 접근할 수 있도록 연산자가 추가되었다.

Javascript 기준으로 치자면 옵셔널 체이닝 'Optinal Chaining'과 유사하다.

$userStreet = $user?->getAddress(8)?->street;

// 풀어서 보기
if (is_null($user)) {
    $userStreet = null;
} else {
    $user = $user->getAddress(8);
    
    if (is_null($user)) {
        $userStreet = null;
    } else {
        $userStreet = $user->street;
    }
}

throw 표현식

드디어 throw를 표현식에도 사용할 수 있게 됐다.

$test = fn() => throw new Exception('Exception in test');
$userData = $session->user ?? throw new Exception('user Not Found');

readonly 프로퍼티 추가

개체 초기화 시, 작성할 수 있는 readonly 프로퍼티가 추가 되었다.

타입이 지정된 프로퍼티에서만 사용이 가능하다.

단, 정적 클래스에서 지원하지 않고 어떤 값이든 다시 배정할 수가 없다.

class Foo 
{
    public readonly string $bar;
    
    public function __construct(string $bar)
    {
        $this->bar = $bar;
    }
}


$fooBar = new Foo('foobar');
var_dump($fooBar->bar); // string(6) "foobar"

그 외에도 변경된 부분은 무수히 많다.

현재는 PHP 8.3까지 출시가 되어서 앞으로 확인해야할게 무궁무진하다.