代码之家  ›  专栏  ›  技术社区  ›  arik

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

  •  1
  • arik  · 技术社区  · 12 年前

    我有以下困境:

    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 回复  |  直到 12 年前
        1
  •  2
  •   Bogdan Stăncescu    12 年前

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

        2
  •  0
  •   Ruben Kazumov    12 年前

    选项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()