2009-05-22 4 views
1

내 개인 멤버 변수에 대한 액세스를 제어하는 ​​클래스에 대한 __get() 함수를 만들고 있습니다. 가능한 모든 회원 가치를 처리 할 수있는 기능을 설계해야합니까? 아니면 공개 회원에게 쓸 수 없습니까? 또한이 클래스를 상속하는 클래스는 private 멤버에 액세스하는 데 내 __get() 함수를 사용한다고 가정합니다.오버로드 된 __get은 모든 멤버 변수를 관리해야합니까?

class ClassA{ 
    private $collection = array(); 
    public $value; 

    function __get($item){ 
    return $collection[$item]; 
    } 

답변

1

아니요.


class A { 
    public $foo = 'bar'; 
    private $private = array(); 

    public function __get($key) { 
     echo 'Called __get() at line #' ,__LINE__, ' with key {', $key ,'}',"\n"; 
     return $this->private[$key]; 
    } 

    public function __set($key, $val) { 
     $this->private[$key] = $val; 
    } 
} 


$a = new A(); 

var_dump($a->foo); 
$a->bar = 'baz'; 
var_dump($a->bar); 

그리고 네, 그것은 것입니다 :


class B extends A { private $private = array(); } 
$b = new B(); 
var_dump($b->bar); 
0

글쎄, 당신의 코드는 배열에 설정되어 있지 않은 개인 항목에 실패합니다. 그러나 다시 한번, 배열의 내용을 처리하는 방법으로 이것을 사용할 수 있습니다. 오버라이드 (override) 할 수있는 호출이 __get()를 사용 상속하지만

function __get($item){ 
    if (isset ($collection[$item])) 
     return $collection[$item]; 
    else { 
     try { 
      return $this->$item ; // Dynamically try public values 
     } catch (Exception $e) { 
      $collection[$item] = 0 ; // Make it exist 
     } 
    } 
    } 

클래스, 그래서 명시 적으로 위해 부모 :: __ 구조()를 사용합니다. 또한 정적 일 수 없음에 유의하십시오. Further reading.

+0

__isset() 오버로드로 처리 할 수 ​​있습니다. –

0

우선 PHP는 클래스 정의에서 속성 이름을 검색하고 그 값을 반환하려고 시도합니다. 속성이 없다면 - PHP는 __get ($ var)를 호출하려고합니다. 여기서 원하는 것을 반환 할 수 있습니다. 이것은 액세스하려는 모든 클래스 멤버에 대해 정의해야하는 Java와 유사한 getters/setter를 알고있는 사람들에게는 약간 혼란스러운 행동입니다. - 그것은 자바와 같은 게터/세터를 사용하는 것이 편안 할 때

당신은 다음과 같이 쓸 수 있습니다 :

public function __set($var, $value) 
{ 
    if (method_exists($this, $method = "_set_" . $var)) 
    { 
     call_user_func(array($this, $method), $value); 
    } 
} 
public function __get($var) 
{ 
    if (method_exists($this, $method = "_get_" . $var)) 
    { 
     return call_user_func(array($this, $method), $value); 
    } 
} 

을 다음 사용자 정의의 getter/setter를

protected function _get_myValue() 
    { 
     return $this->_myValue; 
    } 
protected function _set_myValue($value) 
{ 
    $this->_myValue = $value; 
} 

및 액세스를 정의하여이 코드를 사용 이 방법으로 정의 된 메소드에 :

$obj->myValue = 'Hello world!'; 
관련 문제