네임드 인자 (Named Arguments)
함수를 호출할 때 값을 전달하는 기본적인 방법은 매개변수가 선언된 순서(Position)대로 인자를 채우는 것입니다. 그러나 매개변수의 갯수가 많아지고, 기본값(Default Value)을 가진 매개변수들이 혼재되어 있을 경우 호출 구문이 극도로 불편해지고 가독성이 급격히 떨어지는 현상이 발생합니다.
PHP 8.0부터는 이러한 순서 의존성을 타파하고, 매개변수의 이름을 직접 명시하여 인자 값을 안전하게 주입할 수 있는 네임드 인자(Named Arguments) 문법을 전격 지원합니다.
1. 기존 위치 기반 인자의 한계 (PHP 7)
기존 PHP 버전에서는 매개변수의 기본값 기능을 활용하려 할 때, 중간에 위치한 매개변수를 건너뛰기 위해 모든 기본값을 일일이 재입력해주어야 하는 큰 번거로움이 있었습니다.
// 메일 전송 함수 정의
function sendEmail($to, $title, $body = '', $cc = null, $bcc = null, $priority = 3) {
// 전송 로직...
}
만약 이 함수에서 다른 중간 값들은 기본값을 그대로 두고, 마지막 매개변수인 $priority 값만 1로 낮추고 싶다면 다음과 같이 불필요한 기본값들을 매번 반복적으로 채워 넣어야 호출할 수 있었습니다.
// 중간 기본값($body, $cc, $bcc)을 다 아는 상태로 적어주어야 합니다.
sendEmail('user@example.com', '안녕하세요', '', null, null, 1);
이 방식은 가독성을 망치며, 개발자가 매개변수의 순서를 조금이라도 헷갈릴 경우 엉뚱한 매개변수에 값이 전달되는 심각한 시맨틱 오류를 범하게 만듭니다.
2. 네임드 인자 (parameterName: value) 호출법 (PHP 8)
PHP 8.0의 네임드 인자를 사용하면 함수의 파라미터 이름을 콜론(:)과 결합하여 이름 지정 방식으로 바로 전달할 수 있습니다.
|문법|
functionName(parameterName: value);
네임드 인자를 사용하면 다음과 같은 두 가지의 압도적인 장점을 누릴 수 있습니다:
- 순서 무관: 선언된 순서를 외우거나 지킬 필요 없이 자유로운 순서로 호출할 수 있습니다.
- 기본값 건너뛰기 가능: 기본값을 건너뛰고 오직 필요한 인자만 타겟 주입할 수 있습니다.
예제 파일 named-01.php
<?php
// 프로필 정보 설정 함수 정의
function setupProfile(string $name, int $age, string $role = 'User', string $country = 'KR') {
echo "이름: {$name}, 나이: {$age}, 등급: {$role}, 국가: {$country}<br>";
}
// 1. 순서를 무관하게 이름을 지정하여 호출합니다. (age를 먼저 지정해도 정상 맵핑)
setupProfile(age: 27, name: '이순신');
// 2. 중간 매개변수의 기본값($role = 'User')을 그대로 유지하면서 country만 지정하여 호출합니다.
setupProfile(name: '김철수', age: 30, country: 'US');
?>
실행 결과
이름: 이순신, 나이: 27, 등급: User, 국가: KR
이름: 김철수, 나이: 30, 등급: User, 국가: US
3. 혼용 규칙과 주의사항
네임드 인자는 기존 위치 기반 인자(Positional Arguments)와 섞어서(혼용) 호출할 수도 있습니다. 하지만 안전한 결합을 위해 명확한 연산 규칙을 준수해야 합니다.
위치 인자가 네임드 인자보다 먼저와야 함
위치 기반 인자를 먼저 기술하고, 그 뒤에 네임드 인자를 연결해야 합니다. 만약 네임드 인자를 먼저 쓰고 그 뒤에 위치 인자를 쓰면 구문 컴파일 오류가 발생합니다.
// 1. 올바른 예시: 위치 인자('홍길동', 35)가 먼저 오고, 네임드 인자(country: 'JP')가 뒤에 위치합니다.
setupProfile('홍길동', 35, country: 'JP');
// 2. 잘못된 예시: 네임드 인자를 먼저 쓰고 뒤에 일반 위치 인자(35, 'JP')를 혼용했습니다.
// setupProfile(name: '홍길동', 35, 'JP');
// ➡️ 컴파일 에러 발생!
에러 발생 결과
Fatal error: Cannot use positional argument after named argument
상속 관계에서의 네임드 인자
자식 클래스에서 부모 클래스의 메서드를 오버라이딩(Overriding)할 때 매개변수의 이름을 임의로 바꾸면, 네임드 인자로 메서드를 호출할 때 문제가 발생할 수 있습니다. PHP는 런타임에 전달하는 이름을 기준으로 매칭하므로, 상속 구조를 설계할 때는 부모와 자식 메서드의 매개변수 명칭을 일관되게 동기화해주어야 안전합니다.