PHP PHP에서 리플렉션(Reflection)의 고급 활용법
페이지 정보

영삼이
본문
✅ PHP에서 리플렉션(Reflection)의 고급 활용법
**리플렉션(Reflection)**은 PHP에서 클래스, 메서드, 속성 등의 메타데이터를 런타임에 조회하고 조작할 수 있는 기능입니다. 이 기능은 프레임워크 개발, DI 컨테이너, ORM, 테스트 자동화 등에서 핵심적으로 활용됩니다.
🔍 기본 사용법
클래스 분석
[code=php]
class User {
public string $name;
private int $age;
public function sayHello(): string {
return "Hello";
}
}
$ref = new ReflectionClass(User::class);
echo $ref->getName(); // User
print_r($ref->getProperties());
print_r($ref->getMethods());
[/code]
-
클래스 이름, 속성, 메서드 등 정보 조회 가능
🔧 동적 인스턴스 생성
[code=php]
$ref = new ReflectionClass(User::class);
$instance = $ref->newInstance(); // 생성자 없는 경우
// 생성자 인자가 있는 경우
$instance = $ref->newInstanceArgs(['홍길동']);
[/code]
🧩 비공개(private) 속성 접근
[code=php]
$ref = new ReflectionClass(User::class);
$prop = $ref->getProperty('age');
$prop->setAccessible(true);
$user = new User();
$prop->setValue($user, 30);
echo $prop->getValue($user); // 30
[/code]
-
테스트, 직렬화 등에서 유용
-
반드시
setAccessible(true)
필요
🧠 메서드 호출
[code=php]
$ref = new ReflectionClass(User::class);
$method = $ref->getMethod('sayHello');
$instance = $ref->newInstance();
echo $method->invoke($instance); // Hello
[/code]
🧪 DI 컨테이너 자동 주입 예시
[code=php]
class PostService {
public function __construct(UserService $userService) {}
}
function autoResolve(string $className): object {
$ref = new ReflectionClass($className);
$constructor = $ref->getConstructor();
if (!$constructor) return new $className();
$deps = [];
foreach ($constructor->getParameters() as $param) {
$deps[] = autoResolve($param->getType()->getName());
}
return $ref->newInstanceArgs($deps);
}
$instance = autoResolve(PostService::class);
[/code]
-
생성자 의존성 자동 분석 및 주입
-
Laravel, Symfony 등에서 사용되는 방식과 유사
✅ 실무 활용 사례
분야 | 활용 방식 |
---|---|
DI 컨테이너 | 의존성 자동 주입 |
테스트 프레임워크 | 메서드 자동 실행, Mock 주입 |
ORM | Entity 메타데이터 조회 |
커맨드 버스 | 핸들러 자동 매칭 |
⚠️ 주의사항
-
성능 비용 있음 → 반복 호출 피하기
-
setAccessible(true)
는 보안에 신중하게 사용 -
리플렉션 남용은 코드 가독성을 해칠 수 있음
🧠 요약
-
Reflection은 PHP의 런타임 메타프로그래밍 도구
-
클래스, 메서드, 속성 조작이 가능하며 프레임워크 제작에 필수
-
적절히 사용하면 코드 유연성과 자동화를 극대화할 수 있음
- 이전글PHP에서 JWT 토큰 직접 구현하기 (라이브러리 없이) 25.03.28
- 다음글PHP에서 커스텀 예외 처리 체계 설계하기 25.03.28
댓글목록
등록된 댓글이 없습니다.