Akım Sarmalayıcı olarak örnek bir sınıf tanımı

Aşağıdaki örnekte, fread() gibi standart dosya sistemi akım işlevlerini kullanarak bir küresel değişkene okuma/yazma erişimini mümkün kılan bir var:// sarmalayıcısı gerçeklenmiştir. $GLOBALS["foo"] değişkenine veri yazma ve okuma işlemleri için "var://foo" URL'si kullanılacaktır.

Örnek 1 - Küresel değişkenlere veri okuyup yazan bir akım

<?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 "";

$fp fopen("var://myvar""r+");

fwrite($fp"line1\n");
fwrite($fp"line2\n");
fwrite($fp"line3\n");

rewind($fp);
while (!
feof($fp)) {
    echo 
fgets($fp);
}
fclose($fp);
var_dump($myvar);

?>

Yukarıdaki örneğin çıktısı:

line1
line2
line3
string(18) "line1
line2
line3
"