我正在编写一个模板引擎.它甚至支持多种“格式”.目前它可以解析.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()
目前这些模板是使用eval()解析的.
临
>我不必更改任何代码
>当一个模板发生错误时,你只会得到一个没有用的错误信息
告诉你在哪个文件发生错误,有时行号甚至是错误的.
>安全?模板文件只需要可读取?
>很难调试代码.
>代码更难理解
>更多..?
stream包装和include()
我最近在PHP中阅读了关于流包装器.你甚至可以创建自己的.另一个解决方案不是eval,而是为每个模板“格式”创建一个自定义流包装,并使用include来解析模板.
这有以下(潜在)缺陷:
临
>可能会解决在错误消息中显示错误的文件/行号的问题(有没有经验?)
>您可以处理模板文件,确切地说要如何处理.完全控制.
> allow_url_(fopen | include)必须打开?
这是慢吗? (是eval()慢吗?)
>安全无益. include的做法基本上和eval一样.
>更多…?
编辑:缓存解析文件和include()
第三个选项是将模板解析为PHP代码并缓存它们(如@ Jen-YaKovalev所建议的).
临
>包括缓存
>如果在包含渲染的模板并发生错误时发生错误
错误消息不会指向您正确的文件/最终显示您
行号错误
>您需要一个额外的tmp /目录来保存解析的文件.你需要写
PHP / webserver的权限.会更加不安全,因为黑客
会附加一些恶意代码更容易.
编辑:流过滤器和include(‘PHP:// filter’)
> 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.
临
>不需要像流包装器那么多的代码
>没有像流包装器那么多的可能性(缓存?)
>安全性
>速度?
题