PHP 에서 값을 확인할 때 조건문을 써서 값이 선언되었는지, 비어있는지 확인하고 값을 대입하는 경우가 많다.
확인할 값이 많을 경우 소스의 if 문이 엄청나게 늘어나게 된다.
뭐, 소스라인이 많은걸 좋아하는 사람은 모르겠지만 대부분의 개발자는 지저분하게 느끼거나 조건문을 없애기 위해 여러가지 기법들을 사용한다.
PHP 7.0 부터는 null 병합 연산자를 제공한다.
아래 예를 보면 isset( ...... 구문을 ?? 으로 대체할 수 있다.
$pageTitle = isset($title) ? $title : 'Default Title';
/* same syntax */
$pageTitle = $title ?? 'Default Title';
그럼 위 구문은 어디까지 체크가 가능한지 조금 더 테스트 해보자
결과를 보면 ?? 구문은 null 인 경우 또는 변수가 선언되지 않았을 경우만 대체문자로 넣을 수 있다.
# PHP null coalescing operator
# PHP VERSION 7.0 +
$valueA = 0;
$valueB = null;
$valueC = false;
$valueD = '';
var_dump($valueA ?? 'default'); // -> int(0)
var_dump($valueB ?? 'default'); // -> string(7) "default"
var_dump($valueC ?? 'default'); // -> bool(false)
var_dump($valueD ?? 'default'); // -> string(0) ""
var_dump($valueE ?? 'default'); // -> string(7) "default"
#Result
int(0)
string(7) "default"
bool(false)
string(0) ""
string(7) "default"
외부에서 들어온 값을 확인하는 경우
if (isset($request->input['name'])) {
$name = $request->input['name'];
} elseif (isset($request->query['name'])) {
$name = $request->query['name'];
} else {
$name = 'default name';
}
/* 위 조건문을 병합연산자로 대체가 가능 */
$name = $request->input['name'] ?? $request->query['name'] ?? 'default name';
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
함수 대체도 가능하다. 물론 리턴 값 null 확인이 필요하다.
$user = $this->getUser() ?? $this->createGuestUser();
/* Equivalent to */
$user = $this->getUser();
if (null === $user) {
$user = $this->createGuestUser();
}
PHP 7.4 이후 부터는 ??= 연산자를 통해 직접 값 대입이 가능하다.
// The following lines are doing the same
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// Instead of repeating variables with long names, the equal coalesce operator is used
$this->request->data['comments']['user_id'] ??= 'value';