1

我有以下困境:

ob_start('processBuffer');

function processBuffer($buffer){

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

}

function __autoload($className){

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

}

如果必须第一次在 processBuffer 中加载 SomeClass 类,它不起作用,但如果必须在 processBuffer 函数执行之前加载它,它确实有效。这是为什么?目前,为了规避这个问题,我必须执行以下操作:

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

我该如何解决?

4

2 回答 2

2

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

于 2012-08-26T20:49:56.133 回答
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().

于 2012-08-26T21:12:16.283 回答