Mar*_*ant 10 php template-engine eval stream-wrapper
我正在写一个模板引擎.它甚至支持多种"格式".目前它可以解析.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 ?>
Run Code Online (Sandbox Code Playgroud)
这基本上只是一个标准的PHP.
template.tpl
Name: {>$name}
Posts:
{foreach($posts as $post):}
- {>$post->name} ({=count($post->comments)} comments)
{=:render('post/shortpost', array('post' => $post))}
{endforeach}
Run Code Online (Sandbox Code Playgroud)
这种模板化的"语言"简单地被翻译成上面的PHP.
目前使用这些模板进行解析eval().
临
反对
我最近阅读了关于php中的流包装器.你甚至可以创建自己的.另一种解决方案eval是为每个模板"格式"创建自定义流包装器,并使用include来解析模板.
这有以下(潜在)缺陷:
临
反对
allow_url_(fopen|include) 必须上?eval()很慢?)第三种选择是将模板解析为PHP代码并缓存它们(如@ Jen-YaKovalev所建议的那样).
临
反对
tmp/目录来保存解析的文件.您需要PHP/webserver的写权限.会更加不安全,因为黑客会更容易添加一些恶意代码.最近发现以下php.net页面:
php://filter: http://php.net/manual/en/wrappers.php.phpstrea_filter_register http://fr2.php.net/manual/en/function.stream-filter-register.php这将是解决这个问题的另一种可能性.使用include('php://filter/read=filtername/resource=file.php'),我可以filtername在执行之前包含一个首先通过过滤器的文件.
临
反对
我认为这只是一个人编码风格的品味,你最好投票什么的。
(*) 在早期的项目中,我们在data-url包装的 include中使用了 1 行代码(一个空的类扩展),其性能非常糟糕。
| 归档时间: |
|
| 查看次数: |
1365 次 |
| 最近记录: |