2013-04-23 58 views
0

我一直在閱讀MVC框架如何工作和設計模式本身。我能理解大部分地區,看看它是如何組合在一起的,但在很多例子我見過這樣的事情:關於__get和__set在MVC框架設計中的困惑

class Registry 
{ 
    private $vars = array(); 

    public function __set($index, $value) 
    { 
     $this->vars[$index] = $value; 
    } 

    public function __get($index) 
    { 
     return $this->vars[$index]; 
    } 
} 

在很多教程這就是所謂的「註冊表」。它通常在init文件中實例化,並且是調用核心類(路由處理程序,模板等)的一部分,例如在您的控制器中呈現一個視圖,如$this->registry->template->render('view');

讀取字的代碼'我'可以看到它的作用,$this->vars[$index] = $value,從vars[]陣列取得索引並使其等於$value。所以,如果我們這樣做:

__set(1, 'firstname'); 

// So now 
$vars[1] = 'firstname'; 

__get(1); // Returns 'firstname' 

如果我在這裏錯了,請糾正我。

微弱我可以看到好處和這是多麼有用,但我還不能把握大局。我無法將它與其他組件捆綁在一起,這似乎是一個很大的部分。

我無法圍繞我的目標是什麼。

回答

0

__get()__set()是所謂的magic methods。他們的好處是,你不必給他們打電話,他們將被PHP解釋器本身調用。如果您嘗試訪問對象的不可訪問屬性,則會發生這種情況。這被稱爲property overloading

試試這個:

class Test { 

    private $foo; 

    public function __set($name, $value) { 
     echo "assgning $name => $value"; 
    } 
} 

$t = new Test(); 
$t->foo = 'bar';