我有以下困境:
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');
我该如何解决?
答案 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()
处调用。