标签: stream-wrapper

包含或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 ?>
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()

目前使用这些模板进行解析eval().

  • 我不需要更改任何代码

反对

  • 当模板中发生错误时,您只会收到无用的错误消息,该消息不会告诉您错误发生在哪个文件中,有时行号甚至是错误的.
  • 安全?模板文件只需要是可读的吗?
  • 调试代码很困难.
  • 代码更难理解
  • 更多 .. ?

流包装器和include()

我最近阅读了关于php中的流包装器.你甚至可以创建自己的.另一种解决方案eval是为每个模板"格式"创建自定义流包装器,并使用include来解析模板.

这有以下(潜在)缺陷:

  • 可以解决在错误消息中显示错误的文件/行号的问题(有没有人经历过这个?)
  • 你可以准确地处理模板文件如何处理它.完全控制. …

php template-engine eval stream-wrapper

10
推荐指数
1
解决办法
1365
查看次数

使用自定义流包装器作为PHP的http://流包装器的测试存根

我正在编写一个自定义流包装器,用作使用内置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)

php stream stream-wrapper

7
推荐指数
1
解决办法
1282
查看次数

Composite Stream Wrapper提供部分MemoryStream和完整的原始Stream

有没有人知道一个复合流解决方案,它将Stream的第一部分预先加载到MemoryStream中,并将剩余部分保留为原始Stream,当需要后续部分时将访问它们?

我应该想象一些包装器类将实现Stream接口,并根据访问的部分透明地处理两个流之间的访问.

我希望这是以前有人可能解决的解决方案,也许是为了优化读取大型FileStream的性能.

在我的情况下,我试图解决从SD卡读取大文件的Windows Phone 8错误.此答案中提供了我正试图环绕的问题的更多详细信息:https: //stackoverflow.com/a/17355068/250254

c# memorystream stream wrapper stream-wrapper

5
推荐指数
1
解决办法
1005
查看次数