在PHP MVC应用程序中将数据从Controller传递到View

在SO的几乎所有教程或答案中,我看到了一种将数据从Controller发送到View的常用方法,类View通常看起来类似于下面的代码
class View
{
    protected $_file;
    protected $_data = array();

    public function __construct($file)
    {
        $this->_file = $file;
    }

    public function set($key,$value)
    {
        $this->_data[$key] = $value;
    }

    public function get($key) 
    {
        return $this->_data[$key];
    }

    public function output()
    {
        if (!file_exists($this->_file))
        {
            throw new Exception("Template " . $this->_file . " doesn't exist.");
        }

        extract($this->_data);
        ob_start();
        include($this->_file);
        $output = ob_get_contents();
        ob_end_clean();
        echo $output;
    }
}

我不明白为什么我需要将数据放在一个数组中,然后调用extract($this-> _data).
为什么不直接从控制器直接将一些属性放到视图中

$this->_view->title = 'hello world';

然后在我的布局或模板文件中,我可以这样做:

echo $this->title;
从逻辑上讲,对视图数据进行分组并将其与内部视图类属性区分开来是有意义的.

PHP将允许您动态分配属性,以便您可以实例化View类并将视图数据指定为属性.我个人不会推荐这个.如果您想迭代视图数据,或者只是将其转储以进行调试,该怎么办?

将视图数据存储在数组中或包含对象并不意味着您必须使用$this-> get(‘x’)来访问它.一个选项是使用PHP5的Property Overloading,它允许您将数据存储为数组,但具有$this-> x接口以及模板中的数据.

例:

class View
{
    protected $_data = array();
    ...
    ...

    public function __get($name)
    {
        if (array_key_exists($name,$this->_data)) {
            return $this->_data[$name];
        }
    }
}

如果您尝试访问不存在的属性,将调用__get()方法.所以你现在可以这样做:

$view = new View('home.PHP');
$view->set('title','Stackoverflow');

在模板中:

<title><?PHP echo $this->title; ?></title>

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...