개발 지식

개발 지식

PHP PHP에서 리플렉션(Reflection)의 고급 활용법

페이지 정보

profile_image
영삼이
0건 203회 25-03-28 23:11

본문

✅ 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의 런타임 메타프로그래밍 도구

  • 클래스, 메서드, 속성 조작이 가능하며 프레임워크 제작에 필수

  • 적절히 사용하면 코드 유연성과 자동화를 극대화할 수 있음


댓글목록

등록된 댓글이 없습니다.