【问题标题】:Lazy loading variables in templates在模板中延迟加载变量
【发布时间】:2013-05-14 13:45:48
【问题描述】:

目前我正在这样做:

function load_template($script, $args){
  extract($args);
  require __DIR__ . '/templates/' . $script;
}

在我的控制器代码中:

// if home page was requested
load_template('home.php', array(
  'title'   => get_title(),
  'content' => get_content(),
  ...
));

模板只是一个类似的 PHP 脚本

<!DOCTYPE html>
<html>
<head>
  <title> <?php echo $title; ?> </titlee>
...

我想知道是否可以以某种方式延迟加载这些变量,所以在模板明确请求变量之前,我实际上不会运行 get_title()get_content()

如果不创建模板解析器,这可能吗?我真的很想坚持使用简单的 .php 脚本和 html 作为模板。


简而言之,我要问的是是否可以仅在第一次请求变量时自动为其赋值。

$var = func();  // this should not run

if($var){       // now the code above should run:)
  echo $var;   // <- the value that was just assigned (don't run func() again)
} 

【问题讨论】:

    标签: php templates lazy-loading


    【解决方案1】:

    在我看来,如果你不想改变你的模板来提取变量,你可以创建一个数组来知道每个模板需要哪些变量。

    您可以考虑一个函数(我们将其命名为caller),向其中传递所有参数和模板名称。 caller 可以选择需要哪些变量。这个思路就像 oop 中的工厂类。

    我觉得没有别的办法,但是……

    插入模板并使用不存在的变量时,将显示警告。您可以让 PHP 在警告中抛出异常,然后在 try ... catch 块中解析它。我觉得太复杂了,不值得努力。

    编辑

    第三个想法是创建对象而不是数组。该对象将保留您的所有 $args 变量。在您的模板中,只需将&lt;?php echo $title; ?&gt; 更改为&lt;?php echo $argument_object-&gt;getTitle(); ?&gt;,并编写getTitle() 方法。 getTitle(),作为一种方法而不是一个函数,将只在请求时运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多