2011-01-21 2 views
2

こんにちは 私は、この関数stream_wrapper_register()によって作成されたカスタムラッパーの範囲が何であるか疑問に思っています。私が尋ねる理由は、カスタムラッパーを作成したからですが、関数内にコンテンツを含めるときは、表示されません。stream_wrapper_register()porotcol scopeとは何ですか?

<?php 

class VariableStream { 
var $position; 
var $varname; 

function stream_open($path, $mode, $options, &$opened_path) 
{ 
    $url = parse_url($path); 
    $this->varname = $url["host"]; 
    $this->position = 0; 

    return true; 
} 

function stream_read($count) 
{ 
    $ret = substr($GLOBALS[$this->varname], $this->position, $count); 
    $this->position += strlen($ret); 
    return $ret; 
} 

function stream_write($data) 
{ 
    $left = substr($GLOBALS[$this->varname], 0, $this->position); 
    $right = substr($GLOBALS[$this->varname], $this->position + strlen($data)); 
    $GLOBALS[$this->varname] = $left . $data . $right; 
    $this->position += strlen($data); 
    return strlen($data); 
} 

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


function stream_eof() 
{ 
    return $this->position >= strlen($GLOBALS[$this->varname]); 
} 

function stream_seek($offset, $whence) 
{ 
    switch ($whence) { 
     case SEEK_SET: 
      if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) { 
       $this->position = $offset; 
       return true; 
      } else { 
       return false; 
      } 
      break; 

     case SEEK_CUR: 
      if ($offset >= 0) { 
       $this->position += $offset; 
       return true; 
      } else { 
       return false; 
      } 
      break; 

     case SEEK_END: 
      if (strlen($GLOBALS[$this->varname]) + $offset >= 0) { 
       $this->position = strlen($GLOBALS[$this->varname]) + $offset; 
       return true; 
      } else { 
       return false; 
      } 
      break; 

     default: 
      return false; 
    } 
} 
} 

stream_wrapper_register("var", "VariableStream") 
or die("Failed to register protocol"); 

$myvar = "Test contents"; 
include("var://myvar"); 
?> 

このコードは正常に動作しますが、私はこれに最後のセクションを変更する場合:

function test() 
{ 
$myvar = "Test contents"; 
include("var://myvar"); 
} 

test(); 

内容が表示されていない

は、ここに私のコードです。

答えて

3

このストリームラッパーは、グローバルスコープで動作します。

$GLOBALS[$this->varname] 

この構文では、名前付き変数にグローバルとしてアクセスすることができます。したがって、test()関数のようなローカル変数にはアクセスできません。

このストリームラッパーにアクセスするための即時オプションはありません。 get_defined_vars()。一意の名前を割り当ててglobalにする必要があります。

+0

ありがとうございます。あなたの答えは、私が問題を解決するのを助けました。 $ GLOBALSをクラス配列に変更しました。 – khr2003

0

この設定があなたのphp.iniで許可されているかどうかをチェックする必要があります。

allow_url_include。

関連する問題