2014-06-13 4 views
0

저는 현재 PHP 클래스 예제에서 다음 __get/__ 설정 방법이있다 :배열 및 비 배열 클래스 멤버 변수 모두에 대해 __get 및 __set 마법 메서드를 사용할 수 있습니까?

class example{ 

    /*Member variables*/ 
    protected $a; 
    protected $b = array(); 

    public function __get($name){ 
     return $this->$name; 
    } 

    public function __set($name, $value){ 
     $this->$name = $value; 
    } 

} 

그러나, 표준 보호 변수를 설정 외에, 나는 또한 클래스 내에서 보호 배열을 설정할 수 있도록하고 싶습니다. 다른 질문을 살펴본 결과 __get/__ set 메서드를 사용하여 변수를 간단하게 설정하는 방법에 대한 일반적인 제안을 발견했지만 이러한 마법 메서드를 사용하여 두 배열과 비 배열을 모두 설정할 수있는 방법은 없습니다.

$fun = new $example(); 
$fun->a = 'yay'; 
$fun->b['coolio'] = 'yay2'; 

답변

5

단순과 같이 __get()을 정의

public function &__get($name) 
{ 
    return $this->$name; 
} 

// ... 

$fun = new example(); 
$fun->a = 'yay'; 
$fun->b['coolio'] = 'yay2'; 
var_dump($fun); 

출력 :

object(example)#1 (2) { 
    ["a":protected]=> 
    string(3) "yay" 
    ["b":protected]=> 
    array(1) { 
    ["coolio"]=> 
    string(4) "yay2" 
    } 
} 

당신이있어 필요한 알아서 수행 참조를 다루기 쉽고 버그를 추적하기가 쉽습니다.

+0

정말 인상적이라면 x) 그러나 나는 이것이 어떻게 문서화되지 않았는가? [** PHP magic methods **] (http://www.php.net//manual/en/language.oop5.magic.php) – MackieeE

+0

이것은 간략하게 문서화되어 있지만 조금 더 깊이 파고 싶었습니다. get이 참조로 설정되면 set 함수는 이전과 동일하게 유지됩니까? 또한 참조가 포함 된 함수를 가져 오는 버그가 발생할 수 있으므로 배열을 처리하는 데 필요한 다른 함수 집합을 만드는 것이 좋습니다. – snehoozle

+0

'$ fun-> b = something_else;' –