我目前正在编写模板引擎。它甚至支持多种“格式”。目前,它可以解析.php
个文件和.tpl
(特定于此引擎)。
我会给你一个两个例子,只是为了给你一个想法。
的template.php:
Name: <?php echo $this->h($name) ?>
Posts:
<?php foreach($posts as $post): ?>
- <?php echo $this->h($post->name) ?> (<?php echo count($post->comments) ?> comments)
<?php echo $this->render('post/shortpost', array('post' => $post)) ?>
<?php endforeach ?>
这基本上只是一个标准的PHP。
template.tpl
Name: {>$name}
Posts:
{foreach($posts as $post):}
- {>$post->name} ({=count($post->comments)} comments)
{=:render('post/shortpost', array('post' => $post))}
{endforeach}
这个模板化的“语言”简单地被翻译成PHP。
目前使用eval()
解析这些模板。
临
魂斗罗
我最近在php中读到了关于流包装器的内容。你甚至可以创建自己的。除eval
之外的另一个解决方案是为每个模板“format”创建自定义流包装器,并使用include来解析模板。
这有以下(潜在)缺陷:
临
魂斗罗
allow_url_(fopen|include)
必须在吗?eval()
也慢了吗?)第三个选项是将模板解析为PHP代码并缓存它们(如@ Jen-YaKovalev所建议的那样)。
临
魂斗罗
tmp/
目录来保存已解析的文件。你需要写
PHP / webserver的权限。因为黑客会更加不安全
会更容易添加一些恶意代码。最近发现了以下php.net页面:
php://filter:
http://php.net/manual/en/wrappers.php.php strea_filter_register
http://fr2.php.net/manual/en/function.stream-filter-register.php 这将是解决此问题的另一种可能性。使用include('php://filter/read=filtername/resource=file.php')
,我可以在执行之前包含一个首先通过过滤器filtername
的文件。
临
魂斗罗
答案 0 :(得分:1)
我认为这只是一种编码风格的味道,你最好投票一下。
(*)在早期的项目中,我们在data-url包装的包含中使用了1行代码(空类扩展),其性能非常糟糕。
答案 1 :(得分:0)
您当然不希望在生产环境中的每个请求中解析模板,这将浪费资源,因此是一种缓慢而不是非常智能的方法,所以我强烈建议使用缓存已解析的文件和include()方法。