Php 对MVC框架设计中的_get和_set感到困惑

Php 对MVC框架设计中的_get和_set感到困惑,php,model-view-controller,design-patterns,overloading,Php,Model View Controller,Design Patterns,Overloading,我一直在阅读MVC框架的工作原理和设计模式本身。我可以理解大多数部分,并了解它们是如何结合在一起的,但在许多示例中,我看到了如下内容: class Registry { private $vars = array(); public function __set($index, $value) { $this->vars[$index] = $value; } public function __get($index) {

我一直在阅读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')

读取word的代码“word”我可以看到它的作用,
$this->vars[$index]=$value
,从
vars[]
数组中获取索引并使其等于
$value
。因此,如果我们这样做了:

__set(1, 'firstname');

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

__get(1); // Returns 'firstname'
如果我错了,请纠正我

我隐约看到了它的好处以及它的用处,但我还不能把握更大的图景。我无法将它与其他组件联系起来,而且它似乎是一个很大的部分

我不知道它的用途是什么。

\uuuu get()
\uu set()
就是这样的。它们的好处是,您不必调用它们,它们将由PHP解释器本身调用。如果试图访问对象的不可访问属性,则会发生这种情况。这就是所谓的

试试这个:

class Test {

    private $foo;

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

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

这更像是一个设计讨论,而不是更简洁的代码调试。所以