php – 包含或eval的自定义流包装?
概观
我正在编写一个模板引擎.它甚至支持多种“格式”.目前它可以解析.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)必须打开? 编辑:缓存解析文件和include() 第三个选项是将模板解析为PHP代码并缓存它们(如@ Jen-YaKovalev所建议的). 临 >包括缓存 反对 >如果在包含渲染的模板并发生错误时发生错误 编辑:流过滤器和include(‘php:// filter’) 最近发现以下php.net页面: > php:// filter:http://php.net/manual/en/wrappers.php.php 这将是解决这个问题的另一种可能性.使用include(‘php://filter/read=filtername/resource=file.php’),我可以包括一个文件,它将在执行之前先通过过滤器filtername. 临 >不需要像流包装器那么多的代码 反对 >没有像流包装器那么多的可能性(缓存?) 题 >使用流包装器解析模板文件或类似的经验?
我认为这只是一种编码风格的味道,最好是投票或者一些东西.
>我个人认为eval是邪恶的(每种语言), (*)在早期的项目中,我们在data-url包装中使用了一行代码(一个空类扩展),其性能非常糟糕. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |