PHP 8의 새로운 기능들

 

지난 11월 26일에 PHP 8 버전이 릴리즈되었습니다. JIT 도입이 가장 큰 관심 사항이지만 그것이외에도 여려 변경 사항들이 있습니다. PHP 공식 사이트의 릴리즈 문서에 나와있는 것들중 문서 마지막 부분에 있는 기타 사항들은 제외하고 핵심적인 내용들만 정리해보겠습니다.

1. 명명된 인수(Named arguments) : 함수 호출시 선택적인 인수들 중 필요없는 것은 생략하고 함수 선언에 있는 매개변수명을 사용해 순서에 상관없이 인수 지정할 수 있게 되었습니다.

2. 속성(Attributes) : 자바의 어노테이션과 같은 기능입니다. PHPDoc 주석 대신 PHP의 기본 구문으로 구조화된 메타 데이터를 사용할 수 있습니다. 다만, 속성을 표현하는 구문의 가독성이 좋지는 않은 것 같은데 이 구문을 어떤 것으로 할지에 대해 베타 시절에 여러 안을 놓고 고민이 있었다고 합니다.

3. 생성자 속성 프로모션(Constructor property promotion) : 클래스 생성자 매개변수에 속성을 줄 수 있게 됨으로 초기화관련 코드를 줄일 수 있게 되었습니다.

4. 유니온 타입(Union types) : 함수 매개변수나 리턴값 등 타입 지정이 가능한 곳에서 여러 타입을 지정할 수 있습니다.

5. match 표현식(Match expression) : switch case 문의 단축형입니다.

6. nullsafe 연산자(Nullsafe operator) : 객체의 메소드나 프로퍼티의 null 값을 쉽게 확인해주는 연산자입니다. PHP 8 릴리즈 페이지의 예제에서도 알 수 있듯이 이런 null 값 체크를 제대로 하기 위해서 코드가 길어지는 경우가 있는데 그런 문제를 해결할 수 있게 되었습니다.

7. 합리적인(?) 문자열과 숫자 비교(Saner string to number comparisons) : PHP의 문제점 중 하나로 지적되는 것이 느슨한 비교 연산자로 인해 생기는 문제입니다. 0 == 'foobar' 이 true가 나오는 문제도 그런 문제이죠. PHP 8에서 이 부분에 대해 개선이 있는데 숫자와 문자열 비교시 문자열이 숫자 문자열일 경우는 기존처럼 문자열을 숫자로 변환해 비교하고 그렇지 않다면 숫자를 문자열로 변환해 비교합니다. PHP 비교 연산자 문제에 대한 공부도 되기 대문에 RFC 문서를 한번 읽어보시는 것을 추천합니다.

8. 내장 함수의 일관된 타입 에러(Consistent type errors for internal functions) : 사용자 정의 함수와는 달리 매개변수의 유효성 검사 실패시 경고를 표시하였던 내장 함수에서도 타입 에러를 발생하는 것으로 변경되었습니다.

9. JIT 컴퍼일러(Just-In-Time compilation) : 벤치마크에서는 최대 3배, 특정 어플리케이션에서는 1.5 ~ 2배의 성능 향상을 보이고 있으나 이런 캐시를 사용하는 컴파일 엔진의 한계가 그렇듯이 7.4와 별차이가 없는 경우도 있습니다.