在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一起使用)时那样重要
$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,因为这个文件是从视图类中包含的(参见上面的代码)。当然,但至少这样它看起来会明显不同于“普通”应该访问的变量。非常感谢您提供的代码片段,非常棒;)