2012-06-08 2 views
1

저는 PHP의 OO 시스템과 약간의 단점에 다소 익숙합니다. __get 및 __set 메서드는 "액세스 할 수없는"필드에 액세스 할 때 읽었습니다. 따라서 공개 된 필드 나 클래스 내의 보호 된 필드에 액세스하는 것은 분명히 이러한 함수를 호출하지 않습니다. 하지만 $ obj-> a에 액세스하려고 시도하면 전에 정의 된 적이없는 것은 무엇입니까? 나는 원래 이것이 __get 또는 __set을 호출 할 것이라고 생각했지만 그것이 그렇지 않은 것처럼 보인다. 이 문제를 해결하려면 동적으로 생성 된 모든 필드를 데이터 배열에 넣는 것이 좋습니다.PHP 마술 __get 및 __set. 동적으로 생성 된 필드는 "액세스 가능"하다고 간주됩니까?

$ obj-> 따라서 공개 입력란입니까? 고마워요!

class Example 
    { 
    public function __get($field) 
    { 
     echo 'Getting ' . $field; 
     return $this->$field; 
    } 

    public function __set($field, $value) 
    { 
     echo 'Setting ' . $field . ' to ' . $value; 
     $this->$field = $value; 
    } 
    } 

    $obj = new Example; 
    $obj->randomField = 1; //here randomField is set to 1 but the echo statement is not printed out in __set 
    echo $obj->randomField; //here, 1 will be echoed but not the statement in __get 

    //is randomField a public field? 
+0

은'__set'가 인쇄됩니다 문제가 무엇인가에 에코? – xdazz

+0

"$ obj-> 따라서 공개 필드입니까?" 예, 귀하의 예를 보여줍니다 ... – Matthew

+0

나는 "동적"속성이 공개 된 가시성을 가지고 있다는 것을 경험으로 알고 있지만, 그렇게 말한 PHP 수동 인용을 헛되이 수색했습니다. –

답변

3
$obj = new Example; 
$obj->randomField = 1; // here __set method is called 
echo $obj->randomField; // here __get method won't be called because `$obj->randomField` exists. 

//is randomField a public field? 
// Yes, after you set it, it became a public field of the object.