개발 지식

개발 지식

PHP PHP에서 메타프로그래밍 흉내내기

페이지 정보

profile_image
영삼이
0건 194회 25-03-28 23:07

본문

✅ PHP에서 메타프로그래밍 흉내내기

PHP는 정적 타입 언어는 아니지만, 리플렉션(Reflection), 매직 메서드, 동적 메서드 호출을 활용해 메타프로그래밍 기법을 부분적으로 흉내 낼 수 있습니다. 이 기능을 이용하면 프레임워크 수준의 유연한 구조를 만들 수 있습니다.


🧪 1. Reflection을 이용한 클래스 분석

[code=php]
class User {
    private string $name = "Kim";

    public function sayHello() {
        return "Hello " . $this->name;
    }
}

$reflection = new ReflectionClass(User::class);
$methods = $reflection->getMethods();

foreach ($methods as $method) {
    echo $method->getName() . PHP_EOL;
}
[/code]
  • 클래스 구조를 런타임에 동적으로 확인 가능

  • 주로 ORM, DI Container, Router 등에서 사용


🧲 2. 매직 메서드 __call()로 동적 메서드 핸들링

[code=php]
class DynamicMethod {
    public function __call($name, $arguments) {
        return "호출된 메서드: {$name} / 인자: " . implode(', ', $arguments);
    }
}

$obj = new DynamicMethod();
echo $obj->run('a', 'b'); // 호출된 메서드: run / 인자: a, b
[/code]
  • 존재하지 않는 메서드 호출 시 자동 실행

  • 유연한 API 처리에 활용 가능


🧩 3. 속성 접근 제어: __get() / __set()

[code=php]
class MagicProperty {
    private $data = [];

    public function __get($name) {
        return $this->data[$name] ?? null;
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
}

$obj = new MagicProperty();
$obj->username = 'kim';
echo $obj->username; // kim
[/code]
  • 속성 제어를 동적으로 처리 가능

  • JSON 데이터 맵핑, DTO 등에 활용 가능


🔁 4. 동적 클래스 생성 (eval())

[code=php]
$className = 'GeneratedClass';
$code = "class $className { public function say() { return 'Hello'; } }";
eval($code);

$obj = new $className();
echo $obj->say();
[/code]
  • 보안에 매우 취약하므로 실제 운영에서는 지양

  • 그러나 템플릿 생성기, DSL 구현 등에 활용 가능


💡 활용 사례

  • 라우터에서 URL → 컨트롤러 매핑

  • DI 컨테이너에서 클래스 자동 생성

  • 커맨드 버스에서 동적 핸들러 호출

  • ORM에서 엔티티 속성 자동 매핑


🧠 요약

  • PHP는 정적 메타프로그래밍은 지원하지 않지만, 리플렉션과 매직 메서드를 통해 동적 구조 구현 가능

  • 주의해서 사용하면 유연한 프레임워크/라이브러리 개발에 유리

  • 남용은 디버깅과 유지보수 난이도 상승


댓글목록

등록된 댓글이 없습니다.