Java에는 field에 대한 getter/setter가 존재한다. 

이런 식으로...

String name;

public void setName(String name){
     this.name = name;
}
public String getName(){
     return this.name;
}


PHP에도 비슷한게 있는데 getter/setter를 만들지 않고 java의 map 과 비슷한 방식으로 setter/getter를 사용한다. 근데 먼저 class내에서 변수가 맹글어지고 값이 들어가는걸 한번 살펴보고...

이렇게..

class Test{
     function __construct($name){
          $this->name = $name;
     }
}

클래스가 저렇게 있을때 field가 없다! 아무것도 없다! 만약 java에서라면 에러 팡팡 터진다. name이란 변수가 없으니까!!
근데 PHP는 에러가 안난다. 왜냐 name이 없으면 만들어버린다...(뭐지...)
우선 Test 클래스에는 __set()이 정의되어 있지 않다. PHP엔진은 __set()이 없으므로 자체적으로 __set()을 실행한다...
그래서 name이 없음에도 불구하고 name이란 변수에 값이 할당될 수 있다.


그러면 이제 __set()과 __get()을 어떻게 사용하는지 보고...
class Test{
     private $map;
     function __construct($name){
          $this->name = $name;
     }

     function __set($name, $value){
          $this->map[$name] = $value;
     }
     function __get($name){
          return $this->map[$name];
     }
}

대략적인 방식은 java의 map과 동일하다. key와 value로 구성된다.
클래스에 __set()과 __get()이 정의되어 있으면 PHP엔진은 정의된 set()과 get()을 먼저 호출한다.

class Test{
     private $map;
     function __construct($name){
		// 이렇게 해도되고...
		$this->name = $name;
     }

     function __set($name, $value){
		// 이렇게 해도 되고...
          $this->map[$name] = $value;
     }
     function __get($name){
          return $this->map[$name];
     }
}

$obj = new Test("ME");

$obj->__set("yeory", "yeory");

echo $obj->name."\n";    // ME
echo $obj->__get("yeory");  // yeory
?>


장단점.. ? 변수 선언과 값의 바인딩에 있어서 유연하다. 에러 볼일이 없다....
그러나.. 클래스내에 field가 없기 때문에 __set()하는 곳에서만 선언 이름을 알 수가 있다...
그래서 대부분 정해진 Object에서만 사용하는것 같다. 그 것이 아니라면 주석으로 어떤 이름으로 값이 set 되는지를 적던가..

'Web > PHP' 카테고리의 다른 글

$_REQUEST, $_GET 한 값이 숫자일 때 간혹 \' 요로코롬 나오면?  (0) 2010.10.26
__set(), __get()의 활용.  (0) 2010.10.19
[2010-10-14] 오늘의 삽질  (0) 2010.10.14
오늘 겪엇던 삽질들 -  (0) 2010.10.13

+ Recent posts