PHPでob_startの使い方。出力タイミングを制御しよう

PHPで、出力(表示)のタイミングを制御できる、ob_start()とそれに付随する関数の使い方をまとめました。

他の関数と組み合わせることで、PHPをより便利に扱えることが出来るようになるので、是非最後までご覧ください。

ob_start()は出力バッファリングをオンにする関数

ob_start()は、本来表示されるべき内容を表示せず、バッファという領域に一時的に保存できます。
そして、保存されたバッファを、任意のタイミングで取り出すことが出来る、便利な機能です。

サンプルコード
ob_start(); //バッファをオンにして出力をせず保存する

echo 'hoge';
echo 'fuga';
echo 'piyo';

$text = ob_get_clean(); //バッファをクリアし変数に代入する
echo '表示する内容は「'.$text.'」です。';
表示する内容は「hogefugapiyo」です。

こちらのソースコードの例では、ob_start();の後に3つのechoで出力する処理が入っていますが、バッファがオンになっているので、echoのタイミングでは文字は表示されません。

ob_get_clean();は、保存してあるバッファの中身を取得&クリアする処理です。

最後のechoで、バッファに保存されていた出力内容が変数にまとまっていることが分かります。

ob_start()でバッファリングがオンになり、クリアされるまで出力される内容がバッファに溜め込まれます。

任意のタイミングで解除&取得できる上に、加工しやすい変数として受け取れるため、場面によってはとても重宝する機能です。

ob_start()とセットで使用する関数

ob_start()は、出力バッファリングをオンにする機能、ということは先ほど説明しました。

そのバッファに保存されたデータを取得したり、クリアしたりする関数はまた別で存在しますので、個別に説明していきます。

ob_get_contents() バッファの内容を取得する

ob_get_contents()は、バッファ領域に保存された内容を取得します。

バッファ領域のクリアは行いません。

$text = ob_get_contents();

ob_end_clean() バッファをクリアし、バッファ制御をオフにする

ob_end_clean()は、バッファの保存をすべてクリアし、バッファのオフにします。

ob_start()を終了させたい場面で使用します。

ob_end_clean();

ob_get_contents()+ob_end_clean()のサンプルコード

ob_get_contents()とob_end_clean()で保存内容の取得とクリアを行いました。

実行結果を見て、それぞれの関数の働きを再度確認してみましょう。

サンプルコード
ob_start();

echo 'hoge';

$text1 = ob_get_contents();

echo 'fuga';

$text2 = ob_get_contents();

ob_end_clean();

echo $text1.'<br>';
echo $text2;
hoge
hogefuga

ob_get_clean() バッファの内容を取得し、バッファをクリア&オフにする

既にob_start()で項で使用していましたが、ob_get_clean()は、ob_get_contents()とob_end_clean()と合体させたような便利な関数です。

1行でバッファと取得と既存のバッファの削除が同時に行えるため、汎用的に使用します。

サンプルコード
ob_start();

echo 'Hello, ';
echo 'World!';

$text = ob_get_clean();

echo '$textの中身は「'.$text.'」';
$textの中身は「Hello, World!」

出力バッファリング機能は、外部ファイルを呼び出すなどで活躍する

あくまで出力制御の説明として、上記のサンプルコードはechoを中心に説明しました。

しかし実際の用途としては、includeやrequireなどの外部ファイルを読み込む関数と合わせて使用することが多いです。

ob_start();
include("sample.php");
$text = ob_get_clean();

includeやrequireと組み合わせた例は、こちらの記事でサンプルコードと合わせてまとめております。

【PHP】include、requireの出力を変数に格納する方法

ob_start()は入れ子(ネスト)に出来る

ob_start()によるバッファがオンになっている中でも、再度ob_start()を宣言することが出来ます。

その場合、バッファのクリアは最後に保存されたものから順番に行われていきます。

サンプルコード
$aryHoge = [];
    
ob_start();
echo 'hoge';
ob_start();
echo 'fuga';
ob_start();
echo 'piyo';

$aryHoge[] = ob_get_clean();
$aryHoge[] = ob_get_clean();
$aryHoge[] = ob_get_clean();

print_r($aryHoge);
Array
(
    [0] => piyo
    [1] => fuga
    [2] => hoge
)

なので、バッファで取得したいinclude先でもob_start()関数を使用できます。


PHPで出力を自在に操作できるバッファリング機能。

includeやrequireと合わせて、テンプレートファイルをまとめたり等、用途は多岐にわたります。

バッファリングを活用して、より効率的な開発を進めていきましょう。

以上、PHPでob_startの使い方。出力タイミングを制御しよう、でした。

PHP