2012-01-02 3 views
0

У меня есть класс с объявленными свойствами. Вся суть класса и его расширений состоит в том, что мне нужно, чтобы они всегда были доступны, даже если null, на другом объекте. Так он выглядит:Магический метод в PHP для запуска метода при объявлении свойства?

class Wrapper { 

    public $a = ""; 
    public $b = ""; 
    public $c = ""; 

    public function Wrapper() { 

     $this -> wrapped = new Wrapped(); 

     foreach($this as $key => $val) { 
       if($key != 'wrapped') { 
       $this -> wrapped -> $key = $val; 
       } 
     } 

    } 
} 

Но после создания объекта, я хочу, чтобы иметь возможность перезаписать заявленные значения непосредственно, так:

$wrap_test = new Wrapper(); 
$wrap_test -> a = 12; 

Таким образом, вместо того, чтобы писать метод или с помощью $wrap_test -> wrapped -> a -> 12, я искал эквивалент __set(), который вызывал бы метод всякий раз, когда любое свойство задано.

Есть ли это?

ответ

2

Если ваши свойства объявлены public, нет никакого «события» или другого метода, с которым вы можете подключиться. Свойства могут быть просто изменены кем угодно.

Объявите ваши свойства, как protected или private, поэтому они не могут быть изменены непосредственно извне класса, а затем реализовать __get и __set методы, чтобы вы могли получить доступ к свойствам, как если бы они были public. В методе __set сделайте все, что вам нужно сделать, когда свойство изменится.

+0

Perfect. Теперь единственная проблема - установить свойство из самого класса. Я думаю, у меня есть идея для этого, хотя ... – Anthony

+0

Вот что я придумал (это позволяет избежать статических переменных): '\t $ og_properties = array_keys (array_intersect (get_class_vars (get_class ($ this)), get_object_vars ($ это))); \t \t \t если (in_array ($ имя, $ og_properties)!) { \t \t $ это -> $ имя = $ значение; \t} else {' – Anthony