[PHP] Reflection - Class편


Study/PHP  2019. 9. 25. 22:57

안녕하세요. 명월입니다.


이 글은 PHP의 Reflection - Class편에 관한 글입니다.


Reflection이란 예전에 Java와 C#에서도 소개한 적이 있습니다만, 프로그램의 구조자체를 투영해서 재구축하는 형태의 프로그래밍 기법입니다.

링크 - https://ko.wikipedia.org/wiki/반영_(컴퓨터_과학)

링크 - [C# 강좌 - 62] Reflection 기능 - class 편

링크 - [Java강좌 - 33] Reflection 기능 - Class 편


쉽게 다시 설명하면 우리가 클래스를 $obj = new Class(); 형태로 선언을 할 수 있는데 프로그램 안에서 Class를 동적인 선언으로 바꾸고 싶을 때 사용하는 것입니다.

즉, A 타입일 때는 AClass를 선언하고 B타입일 때는 BClass를 선언하고 싶다고 하면 아래와 같은 코딩이 되겠습니다.


if($type == "A") {
  $obj = new AClass();
} else if($type == "B"){
  $obj = new BClass();
}

어찌보면 당연한 문법이고 그렇게 나아가야 하는 건 맞습니다만 동적인 클래스가 점점 추가가 된다고 할때 계속적인 소스 수정이 가해집니다.

이럴 때 $obj = new $type . "Class" (); 이런 식으로 작성하고 싶을 때가 오는데 그것이 가능하게 하는 것이 Reflection입니다.

<?php
  class AClass {
    public function print(){
      return "AClass";
    }
  }
  class BClass {
    public function print(){
      return "BClass";
    }
  }
  $name = $_GET["type"];
  // Reflection 클래스를 통해서 Class를 찾는다.
  // 파라미터가 A라면 AClass를 B라면 BClass를 찾게된다.
  $r = new ReflectionClass($name.'Class'); 
  // $obj변수에 newInstance를 해서 인스턴스를 생성한다.
  $obj = $r->newInstance();
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
  <?=$obj->print()?>
</body>
</html>

위 예제를 보면 제가 파라미터로 값을 받고 Reflection으로 클래스를 선언하는 방법입니다.

결과는 type의 Get파라미터에 A를 넣게 되면 AClass가 생성이 되고 AClass의 print함수를 호출하게 되는데 결과는 AClass가 나오게 됩니다.

또 파라미터에 B를 넣게 되면 BClass가 생성이 되고 BClass의 Print함수를 호출하게 되는데 결과는 BClass가 나옵니다.

<?php
  class EXClass {
    private $data = 10;
    public function print(){
      return "EXClass";
    }
    private function test(){
      
    }
    public function get(){
      
    }
  }
  $r = new ReflectionClass('EXClass'); 
  var_dump($r->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE));
  var_dump($r->getMethods());
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
</body>
</html>

그리고 Reflecton으로 class의 내부 맴버 변수명과 method명을 확인할 수 있습니다. 위 소스로 보니 확실하게 3개의 메소드 명이 다 나옵니다.

그런데 접근 제한자의 정보와 return과 파라미터 정보는 없네요. 취득 방법이 있는데 제가 못 찾는 것일 수도 있습니다.


참조 링크 - https://www.php.net/manual/en/class.reflectionclass.php


여기까지 PHP의 Reflection - Class편에 관한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.