Skip to content

Instantly share code, notes, and snippets.

@kimjangwook
Created December 6, 2019 03:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kimjangwook/627f1a721b659040fb92d55c57cd1a81 to your computer and use it in GitHub Desktop.
Save kimjangwook/627f1a721b659040fb92d55c57cd1a81 to your computer and use it in GitHub Desktop.

PHP 7.4가 릴리즈 되었다.

PHPer로써 PHP가 점점 새로워지는 것이 즐겁다.

PHP Conference 2019 Tokyo에서 간단히 소개되었지만, 조금 더 자세히 알아보고자 이 포스트를 작성한다.


1. 타입 지정이 가능해졌다.

https://gist.github.com/2303e0cfa815e748d3d32ffe5680d684

2. 스프레드 연산자

Argument Unpacking이라고도 불리는 스프레드 연산자는 사실 5.6버전부터 사용가능했지만 함수의 인수로써만 사용가능했다.

PHP 7.4버전 부터는 배열을 정의 할 때부터 사용할 수 있게 되었다.

https://gist.github.com/f536d2fa0b577ca4141e51fdcbfd2789

3. 화살표 함수

JavaScript에서 우리는 화살표 함수를 사용하면서 편리하다는 것을 알았다.

드디어 PHP에서도 화살표 함수가 사용 가능하게 되었다.

https://gist.github.com/cb2ebb405d96cea5b0b1f73bc49d67b5

4. 데이터가 NULL일 경우의 대응 연산자

https://gist.github.com/a9e8ff9da53a6b3a90ce6752b86c7424

5. Covariant 반환값과 Contravariant 인수

설명이 어려워서 두 가지로 나누어 설명해보도록 한다.

5-1. Covariant 반환값

이전에는 함수를 오버라이딩 할 경우, 리턴 값은 부모 클래스의 리턴 타입에서 변경할 수 없었다.

하지만 7.4버전에서는 리턴 타입을 하위 타입으로 대체할 수 있다.

https://gist.github.com/8de3eb62a5c95252b042ebc2e911b133

5-2. Contravariant 인수

자식 클래스에서 함수를 오버라이딩 할 때, 인수를 부모 클래스의 타입으로 변경할 수 있다.

https://gist.github.com/bab5b1928da0105db86fa0b05393d7c4

6. 약한 참조

C#, 자바, 파이썬 등에서는 이미 구현되어 있는 약한 참조가 PHP에서도 구현되었다.

약한 참조란, 참조된 원래의 오브젝트가 파괴되면, 참조한 오브젝트도 파괴되는 성질을 가진 참조 형태를 의미한다.

https://gist.github.com/1f52317d33ed6be387455cc018ff8e8e

7. 프리로딩(Preloading)

서비스의 속도를 개선하기 위해 OPCache를 사용하여 요청이 전송된 파일을 Opcodes로 변환한 경험이 있을 것이라 생각한다.

이 때, 요청이 왔을 경우 변환이라는 것은 Opcodes로 변환을 하는 데에 시간이 걸린다는 것을 의미한다.

7.4 버전에서는 프리로딩을 이용하여 서버가 시작할 때 특정 PHP 파일 세트를 메모리에 로드하여 변환에 걸리는 시간을 줄일 수 있다.

문제는, 한 번 프리로딩 된 파일은 변경 사항에 대해서 인지하지 못한다는 것에 있다.

프리로딩 된 파일이 변경되었을 경우, 필수적으로 서버를 재시작 하여야 한다.

8. 새로운 커스텀 오브젝트 직렬화(Serialization) 방법

오브젝트를 직렬화 하기 위한 방법으로 __sleep() 매직 함수, __wakeup() 매직 함수, Serializable 인터페이슬 사용하는 세가지 방법이 있었지만, 세가지 방법 모두 문제가 존재하였다.

7.4 버전에서는 이 것을 해결하기 위해 __serialize()__unserialize() 매직 함수를 추가하였다.

https://gist.github.com/ee2f81c62036a659f7d002d3f46811db

9. 외래 함수(Foreign Function) 인터페이스: FFI

PHP에서 C 함수를 호출하거나 C 데이터 구조에 액세스 하는 라이브러리를 로드할 수 있도록 하여다.

속도 개선의 측면에서 좋은 점이 있을 것도 같으나, 내가 앞으로 FFI를 사용할지는 물음표이다.

https://gist.github.com/49b5b3093f0f225ec2962ede584c1dab

10. 숫자 리터럴 분리자

PHP 7.4에서는 숫자를 분리하기 위해 언더스코어를 사용하는 것이 허용되었다.

https://gist.github.com/f06924a53397746607711418c943e4a1

11. Reflection for references

이 것을 무어라 번역하면 좋을지 모르겠다. 굳이 번역하자면, 참조값들을 반영하기 위한 것 정도 일까?

이전에는 두 변수가 동일한 내용을 참조하고 있는지 확인하는 작업이 꽤나 무거운 작업이었지만, PHP 7.4에 도입된 Reflection for references를 사용하면 코스트를 낮출 수 있게 되었다.

12. mb_str_split() 함수 추가

str_split() 함수는 문자열을 배열로 반환한다.

mb_str_split()은 문자를 chunks(덩어리) 별로 해석하여 배열로 반환한다.

https://gist.github.com/5b79f844eb55dba11e8ed6c9e4eb19c8

13. 패스워드 해싱 레지스트리

password_algos()라는 새로운 함수가 추가되었고, 이 함수는 등록된 패스워드 해싱 알고리즘의 리스트를 반환한다.


여기까지 13개의 PHP 7.4의 신기능을 알아보았다.

PHP: New Features에서 더 자세한 내용을 찾을 수 있다.

내년에는 PHP 8이 릴리즈 될 것이며, PHP는 점점 진화하고 있는게 느껴진다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment