33

これら 2 つの PHP に違いはありますか?

ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);

ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);

現在、最初のブロックを使用していますが、機能的に同等であれば、2 番目のブロックの方が簡潔なので、代わりに 2 番目のブロックを使用したいと考えています。

4

4 に答える 4

35

あなたの質問に答えるには:

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

はい。機能的に同等です。


ケース 1:

ob_get_contents()+ ob_end_clean():

ob_get_contents — 出力バッファの内容を返す

ob_end_clean — 出力バッファを消去 (消去) し、出力バッファリングをオフにします

したがって、基本的には、出力バッファーの内容を変数に格納し、それを でクリアしob_end_clean()ます。

ケース 2:

ob_get_clean — 現在のバッファの内容を取得し、現在の出力バッファを削除する

バッファの内容を変数に格納すると、出力バッファが削除されます。


やっていることは本質的に同じです。両方とも同じことをしているので、ここで 2 番目のコード ブロックを使用しても問題はないと思います。

于 2013-07-22T16:47:27.140 に答える
11

ob_get_contents()出力バッファリングを継続するために使用できます。

例:

ob_start();
echo 'Something!';
$html1 = ob_get_contents();
echo 'More to say!';
$html2 = ob_get_contents();
ob_end_clean();

最後に、変数には次の内容があります。

$html1 = 'Something!';
$html2 = 'Something!More to say!';
于 2013-07-22T16:34:40.973 に答える
8

の間にはわずかな違いが 1 つあります。

$stuff = ob_get_clean();

$stuff = ob_get_contents();
ob_end_clean();

E_NOTICEつまり、呼び出した時点でアクティブな出力バッファがない場合、後者はスローしますが、前者はスローしません。出力バッファなしでこれらの関数を呼び出している場合は、おそらく何か間違ったことをしているからです!

2 つのアプローチがほぼ同等であることは、php.netで明示的に文書化されています。

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

の警告スロー動作ob_end_clean文書化されています

関数が失敗すると、E_NOTICE.

ob_get_contentsまたはのドキュメントに同様の文がないことに注意してくださいob_end_clean

これらの関数間にこれ以上の違いがないことを本当に確認したい場合は (違いはありません)、ソース内のob_get_contentsob_end_cleanの定義に飛び込むことができます。絶対に到達すべきではないob_get_clean、不可能なケースに対する奇妙なエラー処理がいくつかありますが、それ以外に、動作が説明どおりであることがわかります。ob_get_clean

于 2016-01-30T13:12:03.707 に答える
1

ドキュメントに基づいて、

ob_get_contents()+ob_end_clean()

次と同じように動作するはずです:

ob_get_clean()

ただし、PHP のバグのため、そうではありません。nextendweb の Roland がバグ レポートを提出しました。

https://bugs.php.net/bug.php?id=76563

コールバックで ob_start を使用する場合、同じ出力バッファで ob_get_clean() を使用すると、コールバックは実行されません。コールバックがスキップされ、予期しない結果が発生します。バグだと思います。

したがって、コールバックをob_start()に渡す場合は、使用する必要があります

$content = ob_get_contents();
ob_clean();

それ以外の:

$content = ob_get_clean();

サンドボックスでテストすると、すべての PHP バージョンに影響することがわかります。

于 2019-05-28T18:41:23.623 に答える