PHP 8의 새로운 기능들

프로그래밍 언어의 하나 인 PHP는, 웹 개발을 할 때 자주 사용되는 언어이며, HTML에 삽입 할 수있는 것이 특징이다. PHP는 현 시점에서는 7.4가 최신 버전이며, 2020년 말에 PHP 8의 공개가 예정되어 있으며, PHP 8에서 구현 될 예정의 기능을 몇가지 미리 알아보자.



◆ 유니온 형


유니온 형은, 일반적으로 1개 밖에 지정할 수 없는 "int"나 "string" 등의 변수 유형을 여러 개 지정할 수 있는 기능이며, 지금까지도 TypeScript로 구현되어 있었다. PHP는 언어가 변수 유형을 자동으로 결정해주는 동적 타이밍을 채용하는 언어이므로, 이 유니온 형과 궁합이 좋은 것. 유니온 형을 사용하는 경우 아래와 같이 코드를 작성한다.


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


참고로, 반환 값이 없음을 나타내는 void형은 유니온 형에 포함 할 수없다.


◆ JIT


JIT는 "Just in time"의 머리 글자이며, PHP의 성능을 향상시키기 위해 도입. PHP는 프로그램을 실행할 때마다 기계가 코드를 읽고 실행할 수있는 코드로 변환하고, 실행이 완료되면 변환 된 코드를 삭제하는 인터프리터 프로그래밍 언어이며, C나 Java와 같은 미리 코드를 기계가 읽기 쉬운 수준의 코드로 변환 해 두는 컴파일러 형 언어와 비교하면 실행 속도면에서 불리했다.




JIT는 변환 된 코드를 저장해두고, 비슷한 명령이 있을 경우에 변환 된 코드를 사용하는 것으로, 일일이 코드를 변환하는 수고를 덜어 속도를 높일 수 있도록 한 기술이다.


JIT가 구현되지 않은 PHP 7과 JIT가 구현 된 PHP를 브라우저에서 실행 속도를 비교 한 동영상이 아래. 오른쪽의 JIT가 구현 된 PHP쪽이 동영상이 매끄럽게 진행되는 것을 알 수있다.




◆ 반환 값 형식에 static 형을 지정 가능


지금까지 self형은 반환값의 선언에 사용 가능했지만, PHP 8에서는 static 형도 사용할 수 있다.


class Foo

{

    public function test(): static

    {

        return new static();

    }

}


◆ WeakMap


PHP 7.4에서 약 참조라는 기능이 구현되어있다. 일반적으로 메모리 영역을 자동으로 해제하는 가비지 콜렉션은, 개체를 참조하는 경우는 그 객체를 해제 할 수 없지만, 약 참조에 의해 참조 된 객체는 가비지 콜렉션에 의한 해방의 대상이된다. PHP 8에서 구현 예정의 WeakMap을 오브젝트에 대해 선언 해두면, 그 객체가 참조되어 있어도 가비지 콜렉션에 의한 해방의 대상이 될 수있다.


class Foo 

{

    private WeakMap $cache;

 

    public function getSomethingWithCaching(object $obj): object

    {

        return $this->cache[$obj]

           ??= $this->computeSomethingExpensive($obj);

    }

}



◆ ::class


객체의 클래스 이름을 가져 오는데에는, PHP 8에서는 get_class()뿐만 아니라 ::class를 사용할 수있게된다.


$foo = new Foo();


var_dump($foo::class);


◆ DateTime과 DatetimeImmutable의 변환


PHP는 객체 생성 후에도 상태를 변화시킬 수 있는 mutable DateTime 클래스와 상태를 변경할 수없는 immutable DatetimeImmutable 클래스가 있고, PHP 8에서는 아래와 같이 쉽게 변환 할 수있다.


#DatetimeImmutableからDateTimeへ

DateTime::createFromInterface(DateTimeInterface $other);


#DateTimeからDatetimeImmutableへ

DateTimeImmutable::createFromInterface(DateTimeInterface $other);




◆ fdiv 함수


정수의 나눗셈을 수행하는 함수 인 fdiv 함수가 새롭게 구현되고, 0으로 나누려고하면 INF, -INF NAN이 상황에 따라 반환된다.


◆ TypeError의 일관성을 보장(호환성 없음)


건네받은 형태가 기대 된 형태와 일치하지 않는 경우, 사용자가 정의한 함수에서는 TypeError가 반환되지만, 내부 함수는 null을 반환. PHP 8에서는 모두 TypeError로 통일된다.


◆ 경고, 정보 오류의 정리(하위 호환성 없음)


지금까지 경고 또는 통지로 간주되어 온 오류를 독립적 인 오류로 표시하거나 알림을 경고하거나하는 등 정리된다.



◆ 기본 오류 레벨 변경(하위 호환성 없음)


PHP 7까지 E_NOTICE나 E_DEPRECATED로 취급되어 온 에러가 E_ALL로 집약된다. 그러면 지금까지 무시되어 온 에러가 PHP 8로 업데이트를 통해 표출 될 수있다.


◆ 오류 제어 연산자의 동작 변경(하위 호환성 없음)


지금까지 오류 제어 연산자 인 @를 기술하면 오류를 무시하고 작업을 진행 할 수 있었지만, PHP 8에서는 @를 기술해도 치명적인 오류가 나타날 수 있다.


◆ 피연산자를 연결하는 경우 우선 순위(하위 호환성 없음)


PHP 8에서는 피연산자를 연결하는 우선 순위가 변경되어있다. 아래의 코드를 예로...


echo "sum: " . $a   $b;


PHP 7까지는 아래와 같이 해석되고 있었지만....


echo ("sum: " . $a)   $b;


PHP 8에서는 다음과 같이 해석된다.


echo "sum: " . ($a   $b);


또한, PHP 8은 현재도 개발 중에 있으며, 예정되어있는 새로운 기능이 변경 될 수도있다.