我正在写一个模板引擎.它甚至支持多种"格式".目前它可以解析.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来解析模板.
这有以下(潜在)缺陷:
临
我正在编写一个自定义流包装器,用作使用内置http://流包装器的HTTP客户端类的单元测试中的存根.
具体来说,我需要'wrapper_data'通过调用stream_get_meta_data自定义流包装器创建的流来控制密钥中返回的值.不幸的是,有关自定义流包装器的文档很糟糕,API似乎不直观.
自定义包装器中的哪种方法控制元wrapper_data响应?
使用底部的类,当我var_dump(stream_get_meta_data($stream));使用自定义包装器创建的流时,我只能得到以下结果...
array(10) {
'wrapper_data' =>
class CustomHttpStreamWrapper#5 (3) {
public $context =>
resource(13) of type (stream-context)
public $position =>
int(0)
public $bodyData =>
string(14) "test body data"
}
...
Run Code Online (Sandbox Code Playgroud)
但我需要哄骗包装器在元数据检索上产生类似下面的东西,这样我就可以测试客户端类对真实http://流包装器返回的数据的解析...
array(10) {
'wrapper_data' => Array(
[0] => HTTP/1.1 200 OK
[1] => Content-Length: 438
)
...
Run Code Online (Sandbox Code Playgroud)
这是我目前为自定义包装器提供的代码:
class CustomHttpStreamWrapper {
public $context;
public $position = 0;
public $bodyData = 'test body data';
public function stream_open($path, …Run Code Online (Sandbox Code Playgroud) 有没有人知道一个复合流解决方案,它将Stream的第一部分预先加载到MemoryStream中,并将剩余部分保留为原始Stream,当需要后续部分时将访问它们?
我应该想象一些包装器类将实现Stream接口,并根据访问的部分透明地处理两个流之间的访问.
我希望这是以前有人可能解决的解决方案,也许是为了优化读取大型FileStream的性能.
在我的情况下,我试图解决从SD卡读取大文件的Windows Phone 8错误.此答案中提供了我正试图环绕的问题的更多详细信息:https: //stackoverflow.com/a/17355068/250254