프로그래밍 언어의 하나 인 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은 현재도 개발 중에 있으며, 예정되어있는 새로운 기능이 변경 될 수도있다.