PHPのob_startでまとめて結果出力!シンプル解説で最短理解

こんにちは!独学プログラマー&ライターのつぶらやです。

ob_startというPHPの関数があります。

公式サイトの説明によると、

【出力のバッファリングを有効にする】とありますが、何の事でしょうか。

バッファリングとは、バッファという場所にデータをためておくことです。

ob_startは、計算した結果をすぐに表示せずに、一旦別の場所に置いておこうという関数なのです。

本日はこのob_startについて、以下の内容でお話したいと思います。

【基本】結果をすぐ出力しない時って?
【実践編】ob_startでまとめて出力
【応用編】ob_startで同じ処理をまとめる

目次

【基本】結果をすぐ出力しない時って?

プログラム内では様々なデータを取得して整形したり、計算したりします。

そのデータを画面などに出力する場合に、echo等を使用してPHPファイル内に記述します。

echoを記述すると、その時点で出力は実行されてしまいます。

でも、すぐに出したくない場合もあると思います。

まとめて出したい時

例えば以下のように、データとhtmlのタグを別の関数で取得処理している場合などがあります。

summarize.php
<?php
function getTitle(){ // タイトルデータ取得の関数
    return "<h2>侍エンジニア</h2>"; 
}

function getNote(){ // 文言データ取得の関数
    return "<p>未経験からエンジニアに!</p>";
}
function makeHtml(){ // htmlの整形関数
    $data = "";
    $data .= '<div class="samurai_title">';
    $data .= getTitle(); // タイトルデータ取得の関数呼び出し
    $data .= getNote(); // 文言データ取得の関数呼び出し
    $data .= '</div>';

    return $data;
}

$html_code = makeHtml();

echo $html_code;
?>
結果
侍エンジニア
未経験からエンジニアに!

<?php ?> で囲まない部分はそのまま画面に表示されてしまうので、変数にタグも入れていく必要があります。

また、コードが読みにくいですので、htmlタグとデータ取得は分けて書かれているといいですよね。

同じ処理をまとめたい時

プログラムを書く上で、同じ処理を何度も繰り返すのはよくありません。

same.php
<div class="disp_html">
    <?php include("disp_html.php"); ?>
</div>

<div class="disp_html">
    <?php include("disp_html.php"); ?>
</div>

上記の例では、disp_html.phpを二度呼び出してしまっています。

呼び出した結果をどこかに保存しておいて呼び出せる方が良いです。

それでは問題点を解決するために、次章からob_startを使う方法を説明していきます。

【実践編】ob_startで同じ処理をまとめる

それでは実践編です。

前章で例に出したsummarize.phpを元にして、ob_startを使ってまとめて出力してみましょう。

ob_start_summarize.php
<?php
function getTitle(){ // タイトルデータ取得の関数
    return "<h2>侍エンジニア</h2>"; 
}

function getNote(){ // 文言データ取得の関数
    return "<p>未経験からエンジニアに!</p>";
}

function makeHtml(){
    ob_start(); // 記録開始
    ?>

    <div class="samurai_title">
        <?php echo getTitle(); ?>
        <?php echo getNote(); ?>
    </div>

    <?php
    $data = ob_get_contents(); // 記録結果を変数に代入
    ob_end_clean(); // 記録終了

    return $data;
}

$html_code = makeHtml();

echo $html_code;
?>
結果
侍エンジニア
未経験からエンジニアに!

結果は、summarize.phpと変わりませんが、htmlタグは変数にいれずそのまま記述出来たので、コードがすっきりしました。

ob_start();

から、

ob_end_clean();

までの間は、画面やコンソールに表示はされません。

$data = ob_get_contents();

$dataの中にはhtmlのタグも、関数で取得したデータもすべて入っています。

画面に表示されるものが、画面に表示されずに別の場所(バッファ領域)に保存されているのです。

【応用編】ob_startの色々な使い方

ob_startの使い方は大体お分かりいただけたでしょうか。

では、前章で例に出したsame.phpを元にして、ob_startを使ってまとめて出力してみましょう

ob_start_same.php
<?php
    ob_start();
    include("disp_html.php");
    $disp_html = ob_get_contents();
    ob_end_clean();
?>

<div class="disp_html">
    <?php echo $disp_html; ?>
</div>

<div class="disp_html">
    <?php echo $disp_html; ?>
</div>

修正前のコードでは

include("disp_html.php");

が二回呼ばれていましたが、一度の呼び出しにする事が出来ました。

まとめ

今回は、PHPのob_start関数についてお話しました。

画面に出力させるさせないも、自由に制御できるようになりましたね。

テンプレートを作ってデータを置換できるようにしたり、色々な使い方があると思います。

どんな使い方が出来るか考えるのも勉強になります。

それでは、また。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次