Menu

PHP null 병합 연산자: ??와 ??= 사용법

PHP null 병합 연산자는 왼쪽 값이 null이거나 설정되지 않은 경우가 아니면 왼쪽 값을 반환합니다: $name = $_GET['name'] ?? 'Guest';. 없는 변수나 배열 키에 대해 경고하지 않습니다. ?? 체인, ??= 대입, ??와 ?:의 차이, nullsafe 연산자 ?->를 배웁니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

??는 왼쪽 값이 존재하고 null이 아니면 그 값을, 아니면 오른쪽 값을 반환합니다: $name = $_GET['name'] ?? 'Guest';. 키를 직접 읽는 것과 달리 변수나 배열 키가 없어도 절대 경고하지 않습니다.

처음 실행할 때는 쿼리 문자열이 없으므로 두 기본값이 모두 쓰입니다. Page 탭의 링크를 클릭하면 $_GET이 채워진 채로 스크립트가 다시 실행됩니다. 첫 실행에서 ?? 없이 $_GET["name"]을 읽으면 일반적인 PHP 환경에서는 Warning: Undefined array key "name"이 출력됩니다. 요청 데이터는 GET과_GET과 _POST 페이지에서 더 다룹니다.

??는 짧은 isset() 검사다

$a ?? $b는 정확히 isset($a) ? $a : $b를 뜻합니다. 변수, 깊이와 관계없는 배열 키, 객체 속성에 모두 동작하며, 처음으로 없는 부분에서 불평 없이 멈춥니다.

검사는 isset과 같으므로, 값이 null인 채로 존재하는 키도 기본값을 받습니다.

??를 이어서 여러 출처를 시도하기

??는 오른쪽 결합이며 원하는 만큼 이어 쓸 수 있습니다. PHP는 설정되어 있고 null이 아닌 첫 번째 피연산자를 반환합니다.

??=는 null일 때만 대입한다

$a ??= $b는 $a가 설정되지 않았거나 null일 때만 $b를 $a에 저장합니다. 기본값을 채우거나 무언가를 한 번 계산해서 재사용하는 가장 짧은 방법입니다.

??=의 오른쪽은 대입이 일어날 때만 평가되며, 그래서 computing 4가 한 번만 나타납니다.

??와 ?:(짧은 삼항)

??는 null인지 검사하고, ?:는 참으로 평가되는지 검사합니다. 0, "", "0" 같은 값에서는 답이 다릅니다.

수량 "0"은 실제 입력입니다. ??는 그것을 유지하고, ?:는 대체합니다. ?:만 쓰면 없는 키에 대해 경고하므로, 블록에서는 ($inputs[$key] ?? null) ?: ...로 감쌌습니다. ?: 자체는 삼항 연산자 페이지에서 다룹니다.

nullsafe 연산자 ?->

?->는 같은 아이디어의 객체 버전으로, PHP 8에서 추가되었습니다. 왼쪽 객체가 null이면 체인 전체가 멈추고, Call to a member function getAddress() on null 같은 Error를 던지는 대신 null을 반환합니다. 기본값을 주려면 끝에 ??를 붙이세요.

사용자 2는 존재하지만 주소가 없고, 사용자 3은 아예 존재하지 않습니다. 둘 다 에러 없이 ?? "unknown" 기본값에 도달합니다.

흔한 실수: ??의 낮은 우선순위

??는 .나 산술 연산자보다 느슨하게 결합합니다. 그래서 "Count: " . $count ?? 0에서 PHP는 먼저 문자열 "Count: " . $count를 만들고, 이것은 절대 null이 아니므로 기본값이 쓰이지 않습니다.

?? 표현식이 더 큰 표현식 안에 있을 때는 항상 괄호로 감싸세요.

자주 묻는 질문

PHP에서 ??는 무슨 뜻인가요?

??는 null 병합 연산자입니다. $a ?? $b는 $a가 존재하고 null이 아니면 $a를, 아니면 $b를 반환합니다. isset($a) ? $a : $b의 줄임이며, $a나 배열 키가 정의되지 않아도 경고를 내지 않습니다.

PHP에서 ??와 ?:의 차이는 무엇인가요?

??는 왼쪽이 null이거나 설정되지 않았을 때만 기본값으로 넘어가므로 0 ?? 5는 0이고 '' ?? 'x'는 ''입니다. ?:는 왼쪽이 거짓으로 평가되면 언제나 넘어가므로 0 ?: 5는 5입니다. 또 ?:는 정의되지 않은 변수와 키에 대해 경고하고, ??는 경고하지 않습니다.

PHP에서 ??=는 무엇을 하나요?

$a ??= $b는 $a가 null이거나 설정되지 않았을 때만 $b를 $a에 대입하고, 그렇지 않으면 $a를 그대로 둡니다. $a = $a ?? $b;의 줄임이며 PHP 7.4에서 추가되었습니다.

PHP의 nullsafe 연산자 ?->란 무엇인가요?

$obj?->method()는 $obj가 null이 아닐 때만 메서드를 호출합니다. null이면 에러를 던지지 않고 체인 전체가 null을 반환합니다. 기본값은 ??와 함께 씁니다: $user?->getAddress()?->city ?? 'unknown'. PHP 8.0에서 추가되었습니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기