PHP에서는 Reflection API를 활용하면 배열에 담겨 있는 값들을 그대로 클래스 생성자의 인수로 전달할 수 있습니다. 이는 런타임에 동적으로 객체를 생성해야 하거나, 설정 파일·데이터베이스에서 가져온 배열 데이터를 기반으로 인스턴스를 만들어야 할 때 특히 유용합니다.
ReflectionClass::newInstanceArgs 메서드
Reflection API에서 제공하는 newInstanceArgs() 메서드를 사용하면 배열 형태의 인수를 생성자에 넘겨 새로운 클래스 인스턴스를 생성할 수 있습니다.
메서드 시그니처는 다음과 같습니다.
public ReflectionClass::newInstanceArgs ([ array $args ] ) : object
매개변수 설명
- $args: 클래스 생성자에 전달할 인수들을 담은 배열입니다. 배열의 각 요소는 순서대로 생성자의 매개변수에 매핑됩니다.
생성자가 인수를 요구하는 경우, 이 메서드는 해당 인수들을 전달받아 새 인스턴스를 생성하고 반환합니다. 만약 클래스에 생성자가 없다면 빈 배열을 전달해도 문제없이 객체가 생성됩니다.
사용 예제
아래 예제에서는 ReflectionFunction 클래스를 대상으로 'substr'이라는 문자열을 배열에 담아 생성자에 전달합니다.
<?php
$my_class = new ReflectionClass('ReflectionFunction');
$my_instance = $my_class->newInstanceArgs(array('substr'));
var_dump($my_instance);
?>실행 결과
위 코드를 실행하면 다음과 같은 출력을 확인할 수 있습니다.
object(ReflectionFunction)#2 (1) { ["name"]=> string(6) "substr" }출력 결과를 보면 ReflectionFunction 객체가 성공적으로 생성되었고, name 속성에 'substr' 문자열이 정상적으로 할당된 것을 알 수 있습니다. 즉, 배열에 담긴 인수가 생성자를 통해 객체 내부로 제대로 전달된 것입니다.
참고: 스프레드 연산자를 활용한 대안
PHP 5.6부터는 가변 인수 언패킹(unpacking) 기능을 사용하여 비슷한 작업을 더 간결하게 처리할 수도 있습니다.
<?php
$args = array('substr');
$instance = new ReflectionFunction(...$args);
?>다만 리플렉션이 필요한 상황(클래스 이름조차 런타임에 결정되는 경우 등)에서는 newInstanceArgs()가 가장 적합한 선택입니다.