Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP MVC应用程序中将数据从控制器传递到视图_Php_Templates_Variable Assignment - Fatal编程技术网

在PHP MVC应用程序中将数据从控制器传递到视图

在PHP MVC应用程序中将数据从控制器传递到视图,php,templates,variable-assignment,Php,Templates,Variable Assignment,在几乎所有的教程或答案中,我看到了一种将数据从控制器发送到视图的常见方法,类视图通常与下面的代码类似: class View { protected $_file; protected $_data = array(); public function __construct($file) { $this->_file = $file; } public function set($key, $value) {

在几乎所有的教程或答案中,我看到了一种将数据从控制器发送到视图的常见方法,类视图通常与下面的代码类似:

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->\u data)。 为什么不直接从控制器将一些属性放到视图中,如

$this->_view->title = 'hello world';
然后在我的布局或模板文件中,我可以执行以下操作:

echo $this->title;

我猜原因可能只是“少打字”,但这有一些很好的副作用:

  • 当编写模板的人不熟悉php时,这会有所帮助,这样他们就不必关心“this
    $this->
    意味着什么?”
  • 当视图的某些属性应该是该类的私有属性,并且库编写器不想将它们公开给模板编写器时,为变量提供单独的容器也会有所帮助
  • 防止名称与视图自身的属性和模板的变量发生冲突
  • 比基于方法的访问方案快得多。现在可能不像创建smarty(也与php4一起使用)时那样重要

从逻辑上讲,将视图数据分组并将其与内部视图类属性区分开来是有意义的

PHP将允许您动态分配属性,这样您就可以实例化视图类并将视图数据分配为属性。但就我个人而言,我不建议这样做。如果您想迭代视图数据,或者只是为了调试而转储它,该怎么办

将视图数据存储在数组中或包含对象并不意味着您必须使用
$this->get('x')
来访问它。一个选项是使用PHP5,这将允许您将数据存储为数组,同时使用
$this->x
接口从模板中获取数据

例如:

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

    public function __get($name)
    {
        if (array_key_exists($name, $this->_data)) {
            return $this->_data[$name];
        }
    }
}
如果尝试访问不存在的属性,将调用该方法。因此,您现在可以执行以下操作:

$view = new View('home.php');
$view->set('title', 'Stackoverflow');
在模板中:

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


同意第1点和第3点。但是关于你的第二点,我不认为容器允许隐藏视图的私有属性,你仍然可以做$this->somePrivateProperty,因为这个文件是从视图类中包含的(参见上面的代码)。当然,但至少这样它看起来会明显不同于“普通”应该访问的变量。非常感谢您提供的代码片段,非常棒;)