Exemplo de classe regsitradao como empacotador de fluxo

O exemplo abaixo implementa o manipulador de protocolo var:// que permite acesso de leitura/escrita a uma variável global usando funções padrão de fluxo de sistemas de arquivos como fread(). O protocolo var:// implementado abaixo, fornecido pela URL "var://foo" irá ler/escrever dados de/para $GLOBALS["foo"].

Example #1 Um Fluxo para ler/escrever variáveis globais

<?php

class FluxoDeVariavel {
    var $posicao;
    var $nomevar;

    function abre_fluxo($caminho, $modo, $opcoes, &$caminho_aberto)
    {
        $url = parse_url($caminho);
        $this->nomevar = $url["host"];
        $this->posicao = 0;

        return true;
    }

    function le_fluxo($contagem)
    {
        $ret = substr($GLOBALS[$this->nomevar], $this->posicao, $contagem);
        $this->posicao += strlen($ret);
        return $ret;
    }

    function escreve_fluxo($dados)
    {
        $esquerda = substr($GLOBALS[$this->nomevar], 0, $this->posicao);
        $direita = substr($GLOBALS[$this->nomevar], $this->posicao + strlen($dados));
        $GLOBALS[$this->nomevar] = $esquerda . $dados . $direita;
        $this->posicao += strlen($dados);
        return strlen($dados);
    }

    function posicao_fluxo()
    {
        return $this->posicao;
    }

    function final_fluxo()
    {
        return $this->posicao >= strlen($GLOBALS[$this->nomevar]);
    }

    function pesquisa_fluxo($deslocamento, $onde)
    {
        switch ($onde) {
            case SEEK_SET:
                if ($deslocamento < strlen($GLOBALS[$this->nomevar]) && $deslocamento >= 0) {
                     $this->posicao = $deslocamento;
                     return true;
                } else {
                     return false;
                }
                break;

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

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

            default:
                return false;
        }
    }

    function metadados_fluxo($caminho, $opcao, $var)
    {
        if($opcao == STREAM_META_TOUCH) {
            $url = parse_url($caminho);
            $nomevar = $url["host"];
            if(!isset($GLOBALS[$nomevar])) {
                $GLOBALS[$nomevar] = '';
            }
            return true;
        }
        return false;
    }
}

stream_wrapper_register("var", "FluxoDeVariavel")
    or die("Falha ao registrar protocolo");

$minhavar = "";

$fp = fopen("var://minhavar", "r+");

fwrite($fp, "linha1\n");
fwrite($fp, "linha2\n");
fwrite($fp, "linha3\n");

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

?>

O exemplo acima produzirá:

linha1
linha2
linha3
string(18) "linha1
linha2
linha3
"