14

私は最近たくさん見てきましたob_get_clean()。通常、私はやった$test .= 'test'

一方が他方よりも高速および/または優れているかどうか疑問に思っています。

を使用したコードは次のob_get_clean()とおりです。

ob_start();

foreach($items as $item) {
    echo '<div>' . $item . '</div>';
}

$test = ob_get_clean();

を使用したコードは次の$test .= 'test'とおりです。

$test = '';

foreach($items as $item) {
    $test .= '<div>' . $item . '</div>';
}

どちらが良いですか?

4

5 に答える 5

6

結果は同じで、パフォーマンスの違いがあったとしても無視できると思います。基本的に、個人的なスタイルの好みの問題です。私は自分で連結を使用します-連結がオプションでない場合にのみ、出力バッファリングを使用します。

また、ob_get_contents() と ob_clean() の両方を実行する代わりに、一度に両方を実行する ob_get_clean() を実行します。

于 2008-11-15T03:21:47.763 に答える
6

出力バッファには、グローバル変数のすべての落とし穴があります。ob_start()からへのすべての実行パスに注意する必要がありますob_get_clean()。そこに到達し、その間に開かれたバッファが閉じられていることを確信していますか? コードが例外をスローする可能性があることに注意してください。それは、次の人が追跡するのが本当に楽しいバグになる可能性があります.

一方で、 - 言いたくないのですが - PHP の内部的な理由により、出力バッファリングは大きな文字列を連結する際に多少高速でした。それが今でも正しいかどうかはわかりません。

于 2008-11-15T06:03:38.420 に答える
4

文字列連結のオーバーヘッドが心配な場合は、次の点に注意してください。

echo'<div>'。$test。'</div>';

これよりもかなり遅いです:

echo'<div>'、$ test、'</ div>';

1つ目は2つの文字列連結にコンパイルされ、その後にエコーが続きますが、2つ目は3つのエコーにコンパイルされますが、これは実際には高速です。

于 2008-11-15T19:36:48.340 に答える
2

大量の文字列を使用している場合、出力バッファリングを使用するとパフォーマンスがわずかに向上する可能性があると思いますが、一般的に使用する場合は、連結の方が優れていると思います。このコードはおそらく他の人が理解しやすく、デバッグしやすいからです。

小さな点ですが、出力バッファリング アプローチを使用する場合は、それを完全に使用することもできます。

ob_start();

foreach($items as $item) {
    echo '<div>';
    echo $item;
    echo '</div>';
}

$test = ob_get_clean();
于 2008-11-15T14:31:09.317 に答える
2

前述のように、出力バッファリングはパフォーマンスに優れています。大きな文字列の場合、パフォーマンスの違いはまったく無視できません。PHP の出力バッファリングを Java の StringBuffer/StringBuilder と比較できます。文字列連結の場合、毎回文字列全体をメモリにコピーする必要があります。出力バッファリングの場合、テキストは適切な増分で成長するバッファに入り、出力ごとにデータをコピーする必要はありません。

インライン HTML の使用を検討することもできます (さらに高速です)。インライン HTML の追加の利点は、IDE が HTML で構文の強調表示を実行できる可能性が高いことです。これは、HTML が PHP 文字列内にある場合には発生しません。変更されたコード (short_open_tags = On が必要):

ob_start();
?>

<? foreach($items as $item) { ?>
    <div><?= $item ?></div>
<? } ?>

<?
$test = ob_get_clean();
于 2008-11-15T16:52:19.607 に答える