是否可以在PHP中引用特定深度的输出缓冲区?

时间:2013-02-14 12:33:48

标签: php

我们可以获得ob级别。我们可以获得当前ob堆栈的长度。但是我们可以在 n 级别引用ob堆栈吗?我真的会受益于在特定深度获取缓冲区的长度。

假设一个例子:

$length = array();

ob_start();
echo "1";
$length[] = ob_get_length(); // length of current stack (depth 1) is 1
ob_end_clean(); 


ob_start();
echo "11";
ob_start();
echo "2";
$length[] = ob_get_length(); // length of current stack (depth 2) is 1
ob_end_clean();
ob_end_clean();

ob_start();
echo "111";
ob_start();
echo "22";
ob_start();
echo "3";
$length[] = ob_get_length(); // length of current stack (depth 3) is 1
ob_end_clean();
ob_end_clean();
ob_end_clean();

print_r($length);

输出是:

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
)

每个最深的堆栈的长度为1.这是预期的。

我的应用程序具有递归输出生成,并且一些输出堆栈必须知道父系统生成的堆栈的长度。我不能依赖于在打开新堆栈之前使用ob_get_length(),因为其他人可以将生成器包装在他们自己的ob堆栈中。这将破坏应用程序。

有没有选择?感谢。

编辑:

说明我需要得到的东西:

ob_start();
echo "111"; // <-- this is the stack of interest
ob_start();
echo "22";
ob_start();
echo "3";
$length[] = ob_get_length(); // length of current stack (depth 3) is 1
$top_stack_len = get_length_of_ob_stack(1); // expected length here should be 3 (strlen("111") == 3)
ob_end_clean();
ob_end_clean();
echo "some more chars to change length of stack 1";
ob_end_clean();

echo $top_stack_len; // I'm expecting to see 3 here.

1 个答案:

答案 0 :(得分:1)

<强>更新

您可以创建一个类来处理它。 我相信如果你需要进一步的帮助,这门课程就足够让我知道了。

class Ob {

    static protected $_level = 0;
    static protected $_data = array();

    static function start() {
        ob_flush();
        self::$_level++;        
        ob_start("Ob::store");
    }

    static function end() {        
        ob_end_flush();      
        self::$_level--;
    }

    static function length($level) {
        ob_flush();
        return strlen(self::$_data[$level]);
    }

    static function store() {
        if(self::$_level != 0)
        self::$_data[self::$_level] .= ob_get_contents();                
    }

    static function printData() {
        print_r(self::$_data);        
    }
}

示例:

Ob::start();
echo '1';
Ob::start();
echo '2222';
Ob::start();
echo '2';
echo Ob::length(1);
echo Ob::length(2);
echo Ob::length(3);
Ob::end();
echo Ob::length(1);
echo Ob::length(2);
echo Ob::length(3);
Ob::end();
echo Ob::length(1);
echo Ob::length(2);
echo Ob::length(3);
Ob::end();

echo Ob::length(1);    
echo Ob::length(2);    
echo Ob::length(3);
Ob::printData();