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

使用自定义流包装器作为PHP的测试存根';s http://stream包装器,php,stream,stream-wrapper,Php,Stream,Stream Wrapper,我正在编写一个自定义流包装器,用作使用内置HTTP://流包装器的HTTP客户机类的单元测试中的存根 具体来说,我需要通过调用自定义流包装器创建的流上的stream\u get\u meta\u data来控制'wrapper\u data'键中返回的值。不幸的是,关于定制流包装器的文档很糟糕,API似乎不直观 自定义包装器中的哪个方法控制元包装器\u数据响应 使用底部的类,我只能在var_dump(stream_get_meta_data($stream))时得到以下结果在使用自定义包装器创建

我正在编写一个自定义流包装器,用作使用内置
HTTP://
流包装器的HTTP客户机类的单元测试中的存根

具体来说,我需要通过调用自定义流包装器创建的流上的
stream\u get\u meta\u data
来控制
'wrapper\u data'
键中返回的值。不幸的是,关于定制流包装器的文档很糟糕,API似乎不直观

自定义包装器中的哪个方法控制元
包装器\u数据
响应

使用底部的类,我只能在
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"
  }
  ...
array(10) {
  'wrapper_data' => Array(
       [0] => HTTP/1.1 200 OK
       [1] => Content-Length: 438
   )
   ...
但是我需要诱使包装器在元数据检索时产生如下内容,以便测试客户机类对real
http://
流包装器返回的数据的解析

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"
  }
  ...
array(10) {
  'wrapper_data' => Array(
       [0] => HTTP/1.1 200 OK
       [1] => Content-Length: 438
   )
   ...
以下是我目前为自定义包装器编写的代码:

class CustomHttpStreamWrapper {

    public $context;
    public $position = 0;
    public $bodyData = 'test body data';

    public function stream_open($path, $mode, $options, &$opened_path) {
        return true;
    }

    public function stream_read($count) {
        $this->position += strlen($this->bodyData);
        if ($this->position > strlen($this->bodyData)) {
            return false;
        }
        return $this->bodyData;
    }

    public function stream_eof() {
        return $this->position >= strlen($this->bodyData);
    }

    public function stream_stat() {
        return array('wrapper_data' => array('test'));
    }

    public function stream_tell() {
        return $this->position;
    }
}

stream\u get\u meta\u data
在中实现。相关部分是

if (stream->wrapperdata) {
    MAKE_STD_ZVAL(newval);
    MAKE_COPY_ZVAL(&stream->wrapperdata, newval);

    add_assoc_zval(return_value, "wrapper_data", newval);
}
i、 e.zval stream->wrapperdata保存的任何内容都被$retval[“wrapper_data”]复制/引用。
您的自定义包装代码由中的
user\u wrapper\u opener
进行“处理”。你就这样

/* set wrapper data to be a reference to our object */
stream->wrapperdata = us->object;
us->object
“是”为流实例化的自定义包装的实例。除此之外,我还没有找到从用户空间脚本影响
流->包装器数据的方法。
但是,如果您只需要
foreach($metadata['wrapper\u data'])
$metadata['wrapper\u data'][$i]
,则可以实现/和/或 例如


怎么样
streamWrapper::stream\u元数据
?也许会有帮助,尽管他们似乎不这么说。我尊重你的良好意愿!一个优雅而令人尴尬的简单解决方案,解决了一个让我左右为难的问题。谢谢。我敢打赌,如果这个网站上有记录,我就不会再兜圈子了。