728x90
안녕하세요.
오늘은 'null 체크 지옥'에서 벗어날 수 있는 nullsafe 연산자에 대해 알아보겠습니다.
nullsafe 연산자
PHP로 객체 지향 프로그래밍을 하다 보면, 객체의 프로퍼티나 메소드를 연쇄적으로 호출하는 경우가 많습니다.
하지만 이 체인 중간에 하나라도 null이 있다면, PHP는 치명적인 오류(Fatal Error)를 발생시킵니다.
이런 오류를 막기 위해 우리는 보통 if와 isset()으로 길고 지저분한 조건문을 작성해야 했습니다.
바로 'null 체크 지옥'입니다.
PHP 8.0부터 도입된 nullsafe 연산자 (?->)는 이 문제를 해결해줍니다.
연쇄 호출 중간에 null을 만나면, 더 이상 다음 코드를 실행하지 않고 즉시 null을 반환하여 오류 없이 안전하게 코드를 중단시킵니다.
null 체크지옥 예시
<?php
class Address {
public function __construct(public ?string $street) {}
}
class Order {
public function __construct(public ?Address $address) {}
}
class User {
public function __construct(public ?Order $order) {}
}
// 모든 정보가 있는 경우
$user1 = new User(new Order(new Address('판교역로 123')));
// 중간에 주문 정보가 없는 경우 (null)
$user2 = new User(null);
// --- 전통적인 null 체크 방식 ---
$street1 = null;
if ($user1->order !== null) {
if ($user1->order->address !== null) {
$street1 = $user1->order->address->street;
}
}
var_dump($street1);
$street2 = null;
if ($user2->order !== null) {
if ($user2->order->address !== null) {
$street2 = $user2->order->address->street;
}
}
var_dump($street2); // if 문 때문에 코드가 복잡하고 길어짐
?>
nullsafe 연산자로 해결 예시
<?php
class Address {
public function __construct(public ?string $street) {}
}
class Order {
public function __construct(public ?Address $address) {}
}
class User {
public function __construct(public ?Order $order) {}
}
$user1 = new User(new Order(new Address('판교역로 123')));
$user2 = new User(null);
// --- nullsafe 연산자 사용 ---
$street1 = $user1->order?->address?->street;
var_dump($street1);
// $user2->order가 null이므로, 뒤의 address->street은 실행조차 하지 않고 즉시 null을 반환
$street2 = $user2->order?->address?->street;
var_dump($street2);
?>
실행결과
string(16) "판교역로 123"
NULL
'PHP' 카테고리의 다른 글
[PHP] __clone() 메소드: 객체 복사 시 발생하는 문제와 해결법 (0) | 2025.09.19 |
---|---|
[PHP] 상속(extends)을 사용하기 (0) | 2025.09.15 |
[PHP] strtotime()으로 자연어 날짜 처리하기 (0) | 2025.09.09 |
[PHP] switch 문을 대체하는 match 표현식 (0) | 2025.09.05 |
[PHP] strpos(), strrpos()로 특정 문자의 위치 찾기 (1) | 2025.09.01 |