在MVC框架设计中对__get和__set感到困惑

时间:2013-04-23 17:22:33

标签: 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)
    {
      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'

如果我在这里错了,请纠正我。

我隐约可以看到它的好处和有用之处,但我还无法把握更大的局面。我无法将其与其他组件联系起来,而且它似乎很重要。

我无法理解其目的是什么。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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';