PHP 8에서 도입된 유니온 타입(Union Type)은 하나의 값에 두 개 이상의 타입을 허용할 수 있게 해주는 강력한 기능입니다. 기존에는 단일 타입만 지정할 수 있었지만, 이제 여러 타입을 조합해 더 유연하고 명확한 코드를 작성할 수 있습니다.
여러 타입을 지정할 때는 세로줄(|) 기호를 사용하여 각 타입을 연결합니다. 유니온 타입은 매개변수(parameter), 반환 타입(return type), 그리고 클래스 프로퍼티(property)에서 모두 사용할 수 있습니다.
기본 문법
type1|type2|……|type_n
예제 1: 유니온 타입 선언
아래 예제는 클래스 프로퍼티와 메서드의 매개변수, 반환 타입에 int와 float 타입을 동시에 허용하도록 선언한 모습입니다.
<?php
class Number
{
private int|float $num;
public function getNum(): float|int
{
return $this->num;
}
public function setNum(float|int $num): void
{
$this->num = $num;
}
}
?>
예제 2: 유니온 타입을 활용한 PHP 8 프로그램
실제 실행 가능한 전체 코드 예제입니다. Number 객체에 정수와 실수 값을 모두 전달할 수 있습니다.
<?php
class Number {
private int|float $number;
public function setNumber(int|float $number): void {
$this->number = $number;
}
public function getNumber(): int|float {
return $this->number;
}
}
// number 객체에 정수 또는 실수 값 전달
$number = new Number();
$number->setNumber(5);
print_r($number->getNumber());
$number->setNumber(11.54);
print_r($number->getNumber());
?>
실행 결과
511.54
유니온 타입에서 널러블(Nullable) 타입 다루기
PHP 7.1에서는 물음표(?type)를 붙이는 방식으로 널러블 타입을 표현했습니다. 하지만 PHP 8에서는 type|null 형태로 널러블 타입을 선언할 수 있습니다. 예를 들어 float|int|null처럼 작성하는 것은 가능하지만, ?float|int와 같은 형태는 허용되지 않습니다.
널러블 타입 문법
type1|type2|null
?type1|type2와 같이 선언해서는 안 됩니다. 이는 모호한(ambiguous) 선언이 되어 버그의 원인이 될 수 있기 때문입니다.
유니온 타입 사용 시 주의사항
컴파일 타임 오류 검사 — PHP는 타입 선언 내에 중복되거나 불필요한(redundant) 타입이 포함된 경우 이를 허용하지 않습니다. 이 검사는 클래스나 인터페이스를 오토로딩하지 않고도 컴파일 타임에 수행됩니다.
중복 타입 선언 금지 — int|int처럼 동일한 타입을 중복 선언할 수 없으며, int|?int 역시 허용되지 않습니다. 위반 시 "Fatal error: Duplicate type… is redundant in …on line." 구문 오류가 발생합니다.
void 타입 조합 불가 — PHP 8에서 void 타입은 다른 어떤 타입과도 결합하여 사용할 수 없습니다.
잘못된 예시
function foo(): void|null {} // 치명적 오류 발생PHP 8의 False 타입
false 타입은 PHP 8 유니온 타입의 일부로 제공됩니다. 일반적으로 반환값이 없거나 오류가 발생했음을 나타낼 때 null을 반환값으로 사용하는 경우가 많습니다. 하지만 실무에서는 false를 사용하는 것이 더 적절한 상황도 있습니다.
예를 들어, 학생 ID로 학생을 조회하는 클래스 메서드가 있다고 가정해 보겠습니다. 해당 ID의 학생이 존재하지 않을 때 null을 반환하여 '학생 ID가 존재하지 않는다'는 의미를 전달할 수 있습니다. 하지만 PHP 관례상 학생을 찾지 못한 경우에는 false를 반환하는 것이 자연스럽습니다.
false 타입의 특징
false 타입은 null 대신 실패(failure) 상황을 나타내는 데 사용됩니다.
false는 단독 타입으로 사용할 수 없으며, 널러블 단독 타입도 허용되지 않습니다. 즉, false, false|null, ?false 같은 선언은 모두 불가능합니다.
false는 매개변수, 프로퍼티, 반환값 등 타입이 허용되는 모든 위치에서 유니온 타입의 일부로 사용할 수 있습니다.
true에 해당하는 리터럴 타입은 존재하지 않습니다. true를 표현하려면 bool 타입만 사용할 수 있습니다.
예제
<?php
class Student {
public function find(int $id): User|false
{
// 학생을 찾으면 User 객체를, 못 찾으면 false를 반환
}
}
?>
마무리
PHP 8의 유니온 타입은 코드의 타입 안정성을 높이면서도 유연성을 확보할 수 있게 해주는 핵심 기능입니다. 다만 중복 타입 선언 금지, void 조합 불가, false 단독 사용 불가 등의 규칙을 반드시 숙지해야 합니다. 이러한 규칙을 잘 활용하면 더욱 견고하고 가독성 높은 PHP 코드를 작성할 수 있습니다.