PHP 8에서 새롭게 도입된 mixed 타입은 내장된 유니언(union) 타입 중 하나로, 사실상 PHP가 처리할 수 있는 거의 모든 값을 수용할 수 있습니다. mixed 타입은 int|float|string|bool|null|array|object|callable|resource와 동일한 의미를 가지며, 어떤 종류의 값이든 전달될 수 있다는 점에서 기존 타입 선언 방식과 차별화됩니다.
mixed 타입의 특징
mixed 타입은 클래스 속성(property), 함수의 매개변수(parameter), 반환값(return value) 어디에서나 사용할 수 있습니다. 즉, null, callable, resource, 모든 클래스 객체, 그리고 PHP의 모든 스칼라 타입(int, float, string, bool)까지 포괄합니다.
다만 mixed 타입을 사용한다는 것이 단순히 타입 선언을 생략하는 것과 같지는 않다는 점에 유의해야 합니다. 타입을 생략하는 경우는 다음 두 가지 상황일 수 있습니다.
- 프로그래머가 작성을 잊어버린 경우
- 구버전 PHP와의 호환성을 위해 의도적으로 특정 타입 선언을 피한 경우
반면 mixed를 명시적으로 선언하면 "모든 타입을 의도적으로 허용한다"는 개발자의 명확한 의도가 코드에 드러나므로, 타입 생략보다 훨씬 명시적이고 안전한 방식입니다.
mixed 타입 기본 예제
아래 예제는 클래스 속성과 메서드의 매개변수, 반환값에 mixed 타입을 적용한 모습입니다.
<?php
class Student {
public mixed $studentProperty;
public function emp(mixed $emp): mixed {}
}
?>
mixed 타입 사용 시 주의사항
1. 변수를 mixed로 캐스팅할 수 없습니다
PHP 8에서 mixed는 의사(pseudo)/가상(virtual) 타입입니다. 여러 타입을 대표하는 추상적인 개념일 뿐이므로, 변수를 mixed로 강제 변환(캐스팅)하는 것은 논리적으로 성립하지 않으며 지원되지 않습니다.
$foo = (mixed) $bar; // 동작하지 않음
참고: gettype()과 get_debug_type() 함수 역시 변수의 타입으로 mixed를 절대 반환하지 않습니다.
2. 다른 타입과 유니언으로 결합할 수 없습니다
mixed는 이미 모든 타입을 포함하므로, 다른 타입과 유니언(|) 형태로 조합하는 것은 허용되지 않습니다.
function foo(mixed|FooClass $bar): int|mixed {} // 오류 발생
위 코드처럼 mixed를 다른 타입과 함께 사용하면 치명적 오류(fatal error)가 발생합니다.
오류 출력 결과
Fatal error: Type mixed can only be used as a standalone type in C:\xampp\htdocs\gud.php on line 2
즉, mixed는 반드시 단독 타입(standalone type)으로만 사용해야 합니다.
mixed 타입을 활용한 실전 예제
다음은 가변 인자(variadic parameter)와 함께 mixed 타입을 사용하여, 어떤 값이든 디버깅 용도로 출력하는 함수의 예입니다.
<?php
function debug_function(mixed ...$data) {
print_r($data);
}
debug_function(10, 'string', []);
?>
실행 결과
Array
(
[0] => 10
[1] => string
[2] => Array
(
)
)
이처럼 정수, 문자열, 배열 등 서로 다른 타입의 값들이 하나의 함수에 문제없이 전달되는 것을 확인할 수 있습니다. 외부 입력값 검증 전 단계의 디버깅 함수나, 다양한 타입을 유연하게 처리해야 하는 라이브러리 코드에서 mixed 타입이 특히 유용하게 활용됩니다.