gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:34:59 25 4
gpt4 key购买 nike

在几乎所有关于 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)。为什么不直接将一些属性从 Controller 放在 View 中,比如

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

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

echo $this->title;

最佳答案

将 View 数据分组并将其与内部 View 类属性区分开来在逻辑上是有意义的。

PHP 将允许您动态分配属性,这样您就可以实例化 View 类并将 View 数据分配为属性。我个人不会推荐这个。如果您想遍历 View 数据,或者只是简单地转储它以进行调试怎么办?

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

例子:

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>

关于php - 在 PHP MVC 应用程序中将数据从 Controller 传递到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com