大约有一百万个 PHP 模板引擎(Blade、Twig、Smarty、Mustache,...),我只是讨厌创建新语法和编译器以在 HTML 中编写 PHP 的想法!我认为它只是不聪明(但这不是我在这里讨论的:)),以通常的方式编写 PHP+HTML 有什么问题 - 不是为了逻辑 - 你知道,所有的变量和循环并定义你想要使用没有这个 {{% %}} 或那个 {:: ::} !至少为了性能!
现在,这些天我正在使用 Laravel,它很棒;它提供(除了 Blade 和任何其他 3rd 方引擎)一个使用 ob_start/include/ob_get_clean 和 eval 的普通 PHP 模板系统。我很高兴知道我可以避免学习在 HTML 中编写 PHP 的新语法。
这是我的建议;我们使用闭包而不是使用带有包含的 ob_* 函数怎么样?这是我整理的一个简单的类,只是为了说明一点:
class Templates{
static public $templates = array();
static public function create($name, $code){
self::$templates[$name] = $code;
}
static public function run($name, $data){
if(!isset(self::$templates[$name]) || !is_callable(self::$templates[$name])) return false;
return call_user_func(self::$templates[$name], $data);
}
}
以下是如何使用它:
Templates::create('test', function($data){
return 'Hi '.$data['name'].' ! ';
});
for($i =0; $i < 10; $i++){
print Templates::run('test', array('name' => 'Jhon'));
}
我认为这种方式要好得多,因为我不需要做任何输出缓冲或使用 eval。而为了在这里“分离关注点”,我们可以将 Templates::create 代码放在一个单独的文件中以保持干净,实际上这样可以变得更加简单和优雅;我们可以用另一种方法来加载模板文件:
static public function load($name){
self::create($name, include($name.'.php'));
}
模板文件的内容会很简单:
return function($data){
return 'Hi '.$data['name'].' ! ';
};
你觉得这怎么样 ?使用闭包的方法或性能是否有任何问题?