PHP __autoload在输出缓冲区处理函数中不起作用

时间:2012-08-26 20:34:15

标签: php autoload output-buffering

我有以下困境:

ob_start('processBuffer');

function processBuffer($buffer){

    $betterBuffer = SomeClass::doSomething($buffer);
    return $betterBuffer;

}

function __autoload($className){

    if($className == 'SomeClass'){ include_once 'some_class.php'; }

}

如果类SomeClass必须首次在processBuffer中加载,它不起作用,但如果必须在执行processBuffer函数之前加载它,它确实有效。这是为什么?目前,为了解决这个问题,我必须做到以下几点:

__autoload('SomeClass');
ob_start('processBuffer');

我该如何解决?

2 个答案:

答案 0 :(得分:2)

这很可能是由PHP内部分层引起的。在输出阶段,在执行堆栈的末尾调用缓冲区处理函数。它与错误处理函数类似,可以更好地记录它们能做什么和不能做什么。例如(虽然我没有测试过这个),我希望缓冲处理函数也不能回显东西(好吧,它可以,但输出可能不会去任何地方)。

答案 1 :(得分:0)

选项1 - “完全面向对象”。

在这种情况下,所有缓冲程序都是从班级内部控制的。

class SomeClass{
    public function __construct(){
        ob_start();
        //. . .
        return (0);
    }

    public function __destruct(){
        // . . . 
        ob_end_flush();
        return (0);
    }
}

选项2 - “__autoload()”。

缓冲在类之外,但是在__autoload()魔术函数内部开始。

function __autoload($class){
    ob_start();
    if($class == 'SomeClass'){ 
        include_once 'some_class.php'; 
    }
}

$c = new SomeClass();
// . . .
ob_end_flush();

正如您在http://php.net/manual/en/function.ob-start.php中所看到的,ob_start()可调用函数将在ob_end_flush()处调用。