PHP PHP에서 메타프로그래밍 흉내내기
페이지 정보

영삼이
본문
✅ 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는 정적 메타프로그래밍은 지원하지 않지만, 리플렉션과 매직 메서드를 통해 동적 구조 구현 가능
-
주의해서 사용하면 유연한 프레임워크/라이브러리 개발에 유리
-
남용은 디버깅과 유지보수 난이도 상승
- 이전글PHP Enum과 기존 상수 클래스 비교 및 활용법 25.03.28
- 다음글PHP + Symfony 컴포넌트만으로 경량 프레임워크 만들기 25.03.28
댓글목록
등록된 댓글이 없습니다.