【问题标题】:How to make variables available in the template?如何使变量在模板中可用?
【发布时间】:2011-12-04 16:20:26
【问题描述】:

我有以下课程:

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,但这没有奏效(我认为这是个坏主意)。

【问题讨论】:

    标签: php templates


    【解决方案1】:

    我总是这样做:

    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;好奇为什么?你会有什么不同的做法,神秘-1'er?
    • 嗯,我没看到-1,也许他/她改变了看法;)
    • @user897029 - 必须有;如果后面有建设性和有用的批评,我会邀请-1。在使用相同方法的另一个答案上,我收到了 -1,之前或之后不久。嗯。
    【解决方案2】:

    你可以使用extract():

    public function display()
    {
        extract($this->variables);
        include($this->template);
    }
    

    【讨论】:

    • 工作也很好,谢谢!但我认为,如果我只包含视图变量而不是 $this,它会更干净。
    【解决方案3】:

    试试这个:

    foreach($variables as $key => $value){
      $$key = $value;
    }
    

    【讨论】:

    • extract($variables, EXTR_OVERWRITE);一样。
    • 啊,好吧!我还不知道 PHP 的所有不错的小功能。
    • 我听说过extract(),但我没有找到(现已解决)我的问题的解决方案。这就是程序员的生活——总是边做边学 ;)
    【解决方案4】:

    您可以使用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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多