2

この段落に続くコード スニペットでは、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 が「テスト」ストリーム ラッパーに登録されていますが、... ラッパー名がどうなるかを事前に知らなかった場合や、開発者が決定します。クラス内のラッパー名をどのように知ることができますか? 適切なコンテキスト オプションを取得するには、事前に知っておく必要があるように思えますが (最初のコンテキスト オプション配列が正しいと仮定しない限り)、事前に知っていなかったらどうでしょうか?

4

1 に答える 1

1

open でどのプロトコルが呼び出されるかを知っているので、そこでコンテキストを使用します。

<?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"
于 2013-08-11T19:26:58.427 に答える