87호. PHP 7.4 Null 병합 대입 연산자, 숫자 리터럴 구분자 free

2019-12-04

오늘은 PHP 7.4에 새로 추가된 Null 병합 대입 연산자와 숫자 리터럴 구분자를 소개하겠습니다.


Null 병합 대입 연산자 (Null Coalescing Assignment Operator)


PHP 7.4에 Null 병합 대입 연산자가 추가되었습니다.


Null 병합 연산자는 좌측 값이 null이 아니면 좌측 값을, null이면 우측 값을 사용합니다.


$username = $_GET['user'] ?? 'nobody';

자기 자신이 null인지 판단해서 대체값을 넣고 싶은 경우 불필요한 코드를 반복해야했습니다. 위와 같이 짧으면 그나마 나은데 실제로는 아래와 같이 긴 경우도 많지요.


$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';

위의 코드를 Null 병합 연산자를 이용하면 아래와 같이 할 수 있습니다.


$this->request->data['comments']['user_id'] ??= 'value';

숫자 리터럴 구분자 (Numeric Literal Separator)


긴 숫자를 한 번에 파악하기 힘들기 때문에 시각적인 구분이 편하도록 언더스코어(_)를 쓸 수 있는 기능이 추가되었습니다. 하긴 좀 긴 숫자 나오면 매번 하나씩 자릿수 세는게 좀 귀찮기도 했고 간혹 잘못 셀 때도 있었죠.


$threshold = 1_000_000_000; // 10억
$testValue = 107_925_284.88 // 1억 규모
$discount = 135_00 // 135달러, 센트로 저장됨 (13500이라고 쓰면 이게 달러인지 센트인지 헷갈릴 수 있다는데, 한국 사람은 살짝 안 와 닿는 예인 것 같아요)

PHP가 지원하는 모든 숫자 리터럴에서 사용할 수 있습니다.


6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binary
0137_041;      // octal

유일한 규칙은 언더스코어를 언제나 두 숫자 사이에만 써야 한다는 것입니다. 따라서 아래의 모든 표현은 유효하지 않습니다.


_100; // 이미 유효한 상수명
 
// 아래는 모두 "Parse error: syntax error"가 발생:
100_;       // 마지막에 썼음 (trailing)
1__1;       // 언더스코어 옆
1_.0; 1._0; // . 옆
0x_123;     // x 옆
0b_101;     // b 옆
1_e2; 1e_2; // e 옆

전화 번호, 카드 번호, 주민 번호 등 번호로 이뤄진 데이터에는 사용하지 마세요. 수학적으로 연산하는게 이상하다면 정수를 사용하지 않는 것이 좋습니다.


마치며


두 기능 다 앞으로 코딩하는데 요긴하게 쓰게 될 것 같아요. 화살표 함수도 그렇고 이 두 기능도 그렇고 조금 더 편하게, 조금 더 보기 쉽게 코드를 작성할 수 있도록 PHP가 개선되는 것 같습니다. 좋네요 :)


1일 1식 라라벨 87호

2019년 12월 4일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.