模板中的延迟加载变量

时间:2013-05-14 13:45:48

标签: php templates lazy-loading

目前我这样做:

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)
} 

1 个答案:

答案 0 :(得分:1)

在我看来,如果您不想更改模板以提取变量,您可以创建一个数组来了解每个模板需要哪些变量。

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

我认为没有别的办法,但是......

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

修改

第三个想法是创建对象而不是数组。该对象将保留您的所有$args变量。在您的模板中,只需将<?php echo $title; ?>更改为<?php echo $argument_object->getTitle(); ?>,然后对getTitle()方法进行编码即可。作为方法而不是函数的getTitle()将仅在请求时运行。