3

私はからいくつかの行動を見ています、ob_start()そしてob_end_*()それは非常に直感に反しているようです。

きちんとした精神で、私のアルゴリズムは次のとおりです。

  1. バッファを開く
  2. いくつかのことをする
  3. バッファを文字列に保存します
  4. バッファを閉じます

最初のケース以外のループケースごとに、実行時に次の通知が表示されます。

注意:ob_end_clean():バッファーの削除に失敗しました。21行目のC:... \ tests\TestOBError.phpに削除するバッファーがありません

注意:ob_end_clean():バッファーの削除に失敗しました。21行目のC:... \ tests\TestOBError.phpに削除するバッファーがありません

注意:ob_end_clean():バッファーの削除に失敗しました。21行目のC:... \ tests\TestOBError.phpに削除するバッファーがありません

現在のストーリーペイロード:「1つ」。

現在のストーリーペイロード:「2」。

現在のストーリーペイロード:「3」。

現在のストーリーペイロード:「4」。

サンプルコード(TestOBError.php):

<?php
class Story {
    public $payload;
    public function __construct($payload) {
        $this->payload = $payload;
    }
}

$stories = array();
$stories[] = new Story('one');
$stories[] = new Story('two');
$stories[] = new Story('three');
$stories[] = new Story('four');

$foo = "";

foreach ($stories as $story) {
    ob_start();
    require 'TestOBError_Foo.php';
    $foo .= ob_get_clean();
    ob_end_clean();
}

print $foo;

?>

TestOBError_Foo.phpの内容:

<p>Current story payload: `<?php print $story->payload; ?>'.</p>

出力バッファを誤用しているだけですか?誰かがこれを行うための「正しい方法」を教えてもらえますか?

PHPバージョン5.4.7を実行しています。

4

2 に答える 2

3

ob_get_clean()と の両方を呼び出す必要はありませんob_end_clean()。次のいずれかを行います。

$foo .= ob_get_clean();

または、次のようにします。

$foo .= ob_get_contents();
ob_end_clean();

PHPマニュアルから:

文字列ob_get_clean ( void )

現在のバッファーの内容を取得し、現在の出力バッファーを削除します。

ob_get_clean()は、本質的に ob_get_contents() と ob_end_clean() の両方を実行します。

于 2012-10-02T02:12:59.310 に答える