如何在模板中提供变量?

时间:2011-12-04 16:20:26

标签: php templates

我有以下课程:

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,但这不起作用(我认为这是一个坏主意)。

4 个答案:

答案 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);
  }
}