自定义流包装器的流上下文

时间:2013-03-11 05:23:42

标签: php stream

在本段后面的代码片段中,我正在使用Test_Stream对象创建一个名为test的流包装器。我正在尝试使用流上下文,并有一些问题。首先是代码:

<?php
class Test_Stream {
    public $context;

    public function __construct()
    {
        print_r(stream_context_get_options($this->context));
        exit;
    }
}

$context = array(
    'test' => array('key' => 'value'),
    'otherwrapper' => array('key' =>'value')
);
$context = stream_context_create($context);

stream_wrapper_register('test', 'Test_Stream');

$fp = fopen('test://www.domain.tld/whatever', 'r', false, $context);

所以现在,在那个代码片段中,Test_Stream正在注册到'test'流包装器但是...如果我事先不知道包装器名称是什么,或者如果我想要保留它会怎么样?由开发人员决定。你怎么知道这个包装器的名字是什么?看起来你必须提前知道它以获得适当的上下文选项(除非你只是假设第一个上下文选项数组是正确的)但是如果你不提前知道怎么办?

1 个答案:

答案 0 :(得分:1)

你知道在打开哪个协议被调用,所以,在那里使用你的上下文:

<?php
class Test_Stream {
    public $context;

    public function stream_open($path, $mode, $options, &$opened_path ){
        var_dump(parse_url($path, PHP_URL_SCHEME));
        exit;
    }
}

$context = array(
    'test' => array('key' => 'value'),
    'otherwrapper' => array('key' =>'value')
);
$context = stream_context_create($context);
stream_wrapper_register('test', 'Test_Stream');
$fp = fopen('test://www.domain.tld/whatever', 'r', false, $context);


string(4) "test"