1

私には次のジレンマがあります:

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');

どうすれば修正できますか?

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 に答える