공부/PHP

PHP 8.0 출시! 새로운 기능 알아보기

2020. 11. 29. 16:28

php 8.0 버전이 정식 릴리즈 되었다.

php 8.0 버전으로 큰 변화들에 대해서 몇가지만 간단하게 정리해 두었다.

1. JIT 

just in time 컴파일로 인하여 속도 향상이 예상된다.

간단하게 설명하면 런타임 중에 코드를 파싱하여 반복적인 작업의 성능을 향상하는 것이라고 한다.

 

2. Union types

자료형을 명시 할 때 다중타입이 가능해진다.

nullable도 ? 혹은 |null로 표기 할 수 있다.

두 경우 모두 자바에선 불가능한 경우이다. (대신 옵셔널이나 제네렉으로 타입을 동적으로 사용하거나 null을 컨트롤 하는 방법이 있다)

public function foo(Foo|Bar $input): int|float;

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

3. Mixed 타입 추가

function foo(mixed $bar);

사실 동적타입인 php의 경우 타입이 mixed이다.

하지만 php에서 점차 타입을 사용할 수 있도록 하였기 때문에 (파라미터 및 반환값, 클래스 속성(7.4)) mixed 타입이라는 것도 명시 할 수 있도록 한 것 같다.

4. Nullsafe 연산자

자바의 nullPointException을 방지하기 위하여 나온 듯 하다.

// 기존 방법
$data = $service ? $service->getData() : null;

// nullsafe 연산자 사용
$data = $service?->getData();    // $service가 null일 경우 $data도 null

5. Constructor property promotion

생성자로 파라미터로 클래스 속성까지 같이 설정이 가능하다.

복잡해질 경우 오히려 혼란이 올 수 있으니 주의해야 할 것 같다.

하지만 잘 사용 할 경우 아래와 같이 매우 간단해 질 수 있다.

// 기존
class Money 
{
    public Currency $currency;
 
    public int $amount;
 
    public function __construct(
        Currency $currency,
        int $amount,
    ) {
        $this->currency = $currency;
        $this->amount = $amount;
    }
}

// 새로운 기능
class Money 
{
    public function __construct(
        public Currency $currency,
        public int $amount,
    ) {}
}

6. named arguments

생성자에 속성에 이름을 줄 수 있는 기능이다.

개인적으로 매우 유용할 것으로 생각된다.

기존에 타입이 없어 유지보수가 어려웠던 부분도 해당 기능을 사용하여 구현한다면 가독성이 많이 좋아질 것 같다.

또한 필요한 속성만 전달 할 수 있으니 매우 유용해 보인다.

예를들어 자바에서는 파리미터 개수와 타입으로 메서드 오버로딩이 가능하였지만 php는 불가능 하였다.

따라서 nullable의 파라미터를 맨 뒤에 두었고 그로 인하여 함수의 확장이 비교적 어려웠었다.

하지만 이 기능을 사용한다면 가독성이 좋고 유지보수에 용이한 코드 작성이 가능해 질 것 같다.

 

해당 기능은 여러가지로 활용이 가능하며 자세한 사항은 아래 링크에서 확인 가능하다

stitcher.io/blog/php-8-named-arguments

 

PHP 8: named arguments - stitcher.io

A close look at named parameters in PHP 8

stitcher.io

// 함수 선언
function foo(string $a, string $b, ?string $c = null, ?string $d = null) { /* … */ }

// 호출 방법
foo(
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);

7. Attributes

주석을 통하여 정의가 가능하다.

Spring에서 어노테이션으로 많은 기능들을 사용하듯이 php에도 주석의 형태로 기능을 사용 할 수 있는 것으로 보인다.

아직 정확한 정보가 많이 없어서 조금더 확인이 필요하다.

관련 링크

wiki.php.net/rfc/attributes_v2

 

PHP: rfc:attributes_v2

PHP RFC: Attributes v2 Large credit for this RFC goes to Dmitry Stogov whose previous work on attributes is the foundation for this RFC and patch. Introduction This RFC proposes Attributes as a form of structured, syntactic metadata to declarations of clas

wiki.php.net

 

php 공식 메뉴얼 : www.php.net/releases/8.0/en.php

 

 

마무리

쉽고 유연하게 만들 수 있는 php의 특징으로 인하여 (느슨한 동적 타입, 새로운 기능들의 추가되고 하위호환성 유지)

유지보수가 어렵다고 생각하였고, php의 최대 장점이 단점으로 돌아온다고 생각하였었다.

하지만 새로운 기능들을 계속 추가하는 php의 특징(?)으로 기능들을 점점 추가하는 것이 보이고 (객체지향 기능, 점차적인 엄격한 타입을 위한 기능들 확대) 이제는 성능과 좋은 기능들을 많이 담은 것 같다.

규칙을 잘 지키고 엄격함을 이용하여 잘 사용하면 아주 만족스러운 결과가 나올것 같다.

이제 회사에서 java로 개발을 하지만 php도 계속해서 관심을 가지고 공부할 예정이다.

 

 

 

 

반응형