2013-04-23 63 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';