我有以下课程:
abstract class TheView
{
public $template = NULL;
public $variables = array();
public function set($name, $value)
{
$this->variables[$name] = $value;
}
public function display()
{
include($this->template);
}
}
模板文件是一个简单的PHP文件:
<?php
echo $Message;
?>
如何在模板中使用TheView::$variables
中的所有变量(每个项目的键应该是变量的名称)。
我已经尝试将所有变量添加到$GLOBALS
,但这不起作用(我认为这是一个坏主意)。
答案 0 :(得分:5)
我总是这样做:
public function render($path, Array $data = array()){
return call_user_func(function() use($data){
extract($data, EXTR_SKIP);
ob_start();
include func_get_arg(0);
return ob_get_clean();
}, $path);
}
注意匿名函数和func_get_arg()
调用;我使用它们来防止$this
和其他变量“污染”被传递到模板中。您也可以在加入之前取消设置$data
。
如果您希望$this
可用,只需直接从该方法extract()
和include()
。
所以你可以:
$data = array('message' => 'hello world');
$html = $view->render('path/to/view.php', $data);
使用 path/to/view.php
:
<html>
<head></head>
<body>
<p><?php echo $message; ?></p>
</body>
</html>
如果要传递View对象,而不是render()
方法的范围,请按如下所示进行更改:
public function render($path, Array $data = array()){
return call_user_func(function($view) use($data){
extract($data, EXTR_SKIP);
ob_start();
include func_get_arg(1);
return ob_get_clean();
}, $this, $path);
}
$view
将是View对象的实例。它将在模板中提供,但仅公开成员,因为它来自render()
方法的范围之外(保留私有/受保护成员的封装)
答案 1 :(得分:3)
您可以使用extract()
:
public function display()
{
extract($this->variables);
include($this->template);
}
答案 2 :(得分:0)
试试这个:
foreach($variables as $key => $value){
$$key = $value;
}
答案 3 :(得分:0)
您可以使用extract函数将数组中的变量导入当前符号表。
abstract class TheView
{
public $template = NULL;
public $variables = array();
public function set($name, $value)
{
$this->variables[$name] = $value;
}
public function display()
{
extract($this->variables);
include($this->template);
}
}