ニンスオの正解を少し明確にするだけです。
私の 2 つのコード サンプルでは、実際には同じ結果が得られません。実際、コールバックを と組み合わせて使用してob_get_clean()
もまったく役に立ちません。
これは、バッファのクリーニングまたはフラッシュ時にコールバックが適用されるためです。
ただしob_get_clean()
、最初にコンテンツを取得してから、バッファを消去します。つまり、返される内容はコールバックによって返される結果ではなく、コールバックに渡される入力です。
これら 2 つの単純な (そしてハックな) スクリプトを作成して、デモを行いました。
これob_get_clean()
は正しい結果を使用しますが、生成しません。
// Tests the use of callbacks with ob_get_clean().
class TestWithGetClean {
// This variable is set when obcallback is called.
public $foo = null;
// The output buffer callback.
public function obcallback($value) {
$this->foo = 'set';
return $value . '(modified)';
}
// Main method.
public function run() {
ob_start(array($this, 'obcallback'));
echo 'this is the output', PHP_EOL;
return ob_get_clean();
}
}
// Run the test with ob_get_clean().
$t = new TestWithGetClean();
echo $t->run(); // This method returns a value in this test. (But not the correct value!)
echo $t->foo, PHP_EOL;
これを実行した場合の出力は次のとおりです。
これが出力です
設定
テキスト'(modified)'
はどこにも表示されません。ただし、インスタンス変数$foo
が setであるため、コールバックは確実に呼び出されることに注意してください。ただし、出力は当初の期待どおりではありません。
を使用するこれと比較してくださいob_end_flush()
:
// Tests the use of callbacks with ob_end_flush().
class TestWithEndFlush {
// This variable is set when obcallback is called.
public $foo = null;
// The output buffer callback.
public function obcallback($value) {
$this->foo = 'set';
return $value . '(modified)' . PHP_EOL;
}
// Main method.
public function run() {
ob_start(array($this, 'obcallback'));
echo 'this is the output', PHP_EOL;
ob_end_flush();
}
}
// Run the test with ob_end_flush().
$t2 = new TestWithEndFlush();
$t2->run(); // This method produces output in this test.
echo $t2->foo, PHP_EOL;
これにより、次の出力が生成されます。
これが出力です
(修正)
設定
ただし、出力がクライアントに直接送信されるため、もちろんこれはあまり役に立ちません。そのため、結果をさらに操作することはできません。(たとえば、テキストを Symfony HttpFoundation Component Request オブジェクトにラップします)。