1 <?php 2 /** 3 * 引用:http://php.net/manual/en/function.stream-wrapper-register.php 4 * 把变量当成文件读写的协议 5 * 6 * Class VariableStream 7 */ 8 class VariableStream 9 { 10 private $postition; // 当前的位置 11 private $varname; // 变量的名字 12 13 /** 14 * 打开 15 * 16 * @param $path 17 * @param $mode 18 * @param $options 19 * @param $opened_path 20 * @return bool 21 */ 22 public function stream_open($path, $mode, $options, &$opened_path) 23 { 24 $url = parse_url($path); 25 26 $this->varname = $url['host']; 27 $this->postition = 0; 28 29 return true; 30 } 31 32 /** 33 * 读取 34 * 35 * @param $count 36 * @return string 37 */ 38 public function stream_read($count) 39 { 40 41 $p = $this->postition; 42 $ret = substr($GLOBALS[$this->varname], $p,$count); 43 $p += $count; 44 return $ret; 45 } 46 47 /** 48 * 写入 49 * 50 * @param $data 51 * @return int 52 */ 53 public function stream_write($data) 54 { 55 $v = &$GLOBALS[$this->varname]; 56 $l = strlen($data); 57 $p = &$this->postition; 58 $v = substr($v,0,$p) .$data.substr($v,$p+=$l); 59 60 return $l; 61 } 62 63 /** 64 * 返回位置 65 * 66 * @return mixed 67 */ 68 public function stream_tell() 69 { 70 return $this->postition; 71 } 72 73 /** 74 * 寻位 75 * 76 * @param $offset 77 * @param $whence 78 * @return bool 79 */ 80 public function stream_seek($offset, $whence) 81 { 82 $dp = $p = &$this->postition; 83 $l = strlen($GLOBALS[$this->varname]); 84 85 switch($whence) 86 { 87 case SEEK_SET: 88 $p = 0; 89 break; 90 case SEEK_END: 91 $p = $l; 92 break; 93 default: 94 return false; 95 } 96 $p += $offset; 97 $ret = ($p >= 0 || $p <= $l); 98 if(!$ret) 99 $this->postition = $dp; 100 return $ret; 101 } 102 103 public function stream_eof() 104 { 105 return strlen($GLOBALS[$this->varname])== $this->postition; 106 } 107 } 108 109 // 撤销已注册的同名协议 110 if(in_array('var',stream_get_wrappers())) 111 { 112 stream_wrapper_unregister('var'); 113 } 114 // 注册自己的协议 115 stream_wrapper_register('var','VariableStream') or die('Failed to register protocol'); 116 117 $myvar = ""; 118 $fp = fopen('var://myvar','r+'); 119 if(!$fp){ 120 die('Failed to open the file!'); 121 } 122 $str = "Hello the world!"; 123 fwrite($fp,$str,strlen($str)); 124 125 echo 'The length of the string is ' .strlen($myvar) ." "; 126 echo 'The value of variable ,$myvar,is :' .$myvar ." "; 127 echo 'The position of the cursor is :' .ftell($fp) ." "; 128 echo 'Is at the end of the file :' .(feof($fp) ? 'true':'false') ." "; 129 if(fseek($fp,-16,SEEK_END)) 130 { 131 echo 'Now,the position is :' .ftell($fp); 132 }