2011-01-21 2 views
2

Привет Мне интересно, какова область пользовательской оболочки, созданной этой функцией stream_wrapper_register(). Причина, по которой я спрашиваю, заключается в том, что я создал пользовательскую оболочку, но всякий раз, когда я пытаюсь включить содержимое внутри функции, они не отображаются.Что такое stream_wrapper_register() область porotcol?

Вот мой код:

<?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.

Смежные вопросы