在模板中延迟加载变量


Lazy loading variables in templates

目前我是这样做的:

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

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

你可以考虑一个函数(让我们把它命名为caller),你向它传递所有的参数和模板名。caller可以选择需要哪些变量。这个想法就像oop中的工厂类。

我认为没有别的办法,只有……

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

编辑

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