안녕하세요. 명월입니다.
이 글은 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편에 관한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Study > PHP' 카테고리의 다른 글
[PHP] PHP의 익명 함수(람다식)와 클로져(closure) (0) | 2019.09.29 |
---|---|
[PHP] PHP 코딩 영역과 HTML 디자인 영역을 분리 시키는 라이브러리 Smarty (0) | 2019.09.28 |
[PHP] Reflection - Variable편 (0) | 2019.09.27 |
[PHP] Reflection - Method편 (0) | 2019.09.26 |
[PHP] 에러 페이지를 처리하는 방법 (추가: ob_clean함수와 die함수 사용법) (0) | 2019.09.24 |
[PHP] 분산 설정 파일(.htaccess) 사용법 (0) | 2019.09.24 |
[PHP] 데이터 베이스(mariaDB)를 연결해서 사용하는 방법 (0) | 2019.09.20 |
[PHP] IO 사용법 (0) | 2019.09.19 |