[PHP] Reflection - Variable편


Study/PHP  2019. 9. 27. 09:00

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


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


이전에 제가 Class와 Method에 대해 설명했습니다.

링크 - [PHP] Reflection - Class편

링크 - [PHP] Reflection - Method편


사실 PHP에서는 Reflection Variable이 크게 필요하지는 않습니다.

다른 언어, 특히 컴파일 언어(Java나 C#)에서는 컴파일 전에 Unit테스트를 만들어서 해당 클래스의 변수가 예상대로 잘 들어가 있는지 확인하기 위해 사용합니다만, PHP는 컴파일 단계가 없기 때문에 이런 테스트가 의미가 없겠네요.

그냥 바로 var_dump로 찍어보는게 훨씬 빠르고 편할 테니깐요.

그래도 PHP측에서 제공하는 기능이니 간단하게 살펴보겠습니다.

먼저 보통 설계를 하면 Class 안의 맴버변수는 private으로 만드는 게 정석이기 때문에 private타입을 취득하는 방법에 대해 알아보겠습니다.

<?php
  class EXClass {
    private $data = "init";
    public function getData(){
      return $this->data;
    }
  }
  // Reflection으로 EXClass를 찾는다.
  $r = new ReflectionClass('EXClass'); 
  // 인스턴스를 생성시킨다.
  $obj = $r->newInstance();
  // 맴버 변수명 data를 찾는다.
  $v = $r->getProperty("data");
  // private, protected의 경우에 외부에서 호출이 가능하게 한다.
  $v->setAccessible(true);
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
  <?=$v->getValue($obj)?>
</body>
</html>

위 소스를 보면 EXClass안의 data 맴버 변수는 private으로 되어 있습니다. 그런데도 getValue함수를 통해 class의 data값을 직접 취득합니다.

이번에는 반대로 private 변수에 대이터를 넣어보겠습니다.

<?php
  class EXClass {
    private $data = "init";
    public function getData(){
      return $this->data;
    }
  }
  // Reflection으로 EXClass를 찾는다.
  $r = new ReflectionClass('EXClass'); 
  // 인스턴스를 생성시킨다.
  $obj = $r->newInstance();
  // 맴버 변수명 data를 찾는다.
  $v = $r->getProperty("data");
  // private, protected의 경우에 외부에서 호출이 가능하게 한다.
  $v->setAccessible(true);
  // data의 변수값을 change로 넣는다.
  $v->setValue ($obj,"change");
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
  <?=$v->getValue($obj)?>
</body>
</html>

이번에는 setValue를 통해서 맴버변수에 데이터를 넣었습니다.


링크 - https://www.php.net/manual/en/class.reflectionproperty.php


여기까지 PHP에서 다루는 기본 Reflection을 소개했습니다. 이제 PHP를 MVC 패턴으로 사용할 준비가 60%로 되었네요.

이 Reflection을 통해서 Java의 spring과 MVC를 흉내내볼 생각입니다.


그럼 PHP도 확실히 소스 관리면에서 매우 편해 질 것이라고 생각됩니다.


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


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