PHPでob_startの使い方とか使い道とか

PHPで自作フレームワークを作る時にob_start関数が便利そうなので、周辺知識をまとめておく。

ob_startとは何か?

ob_start関数とは、出力用のバッファリングを有効にするための関数。

普通echo "hello"などのように書くとターミナルやHTMLに文字が出力されるが、ob_startを使うことですぐに標準出力として結果を出すのではなく、バッファリングに溜め込むことができるようになる。

(バッファリングとは、パソコン上に一旦データを溜め込む場所みたいなやつ)

<?php

  ob_start();
  echo "hello";
  $content = ob_get_clean();

ただob_start()関数を使っただけでは、「バッファリングを使うよ」と宣言しているだけなので、実際にバッファリングの中身を変数に格納するためにはob_get_clean関数を使うこと。

ob_get_cleanを使うことで、バッファリングの内容を出力した後にバッファリングを削除してくれる。

また、バッファリングの内容を出力したいだけであればob_get_contents、バッファリングを削除したい場合はob_end_cleanを使うと良い。

参考:PHP: ob_get_contents - Manual

参考:PHP: ob_get_clean - Manual

参考:PHP: ob_end_clean - Manual

実践的なob_startの使い方

上記の例では簡単なものを示したが、実際のob_startの使い所は「何かしらのファイルに変数を格納して、新たなコンテンツを作る」という使い方が多い。

この説明だと分かりにくいと思うので、以下は例を示す。

例えば、view.phpというファイルがあるとする。

// view.php
<?php

<html>
<head>
        <title><?php echo $title;?></title>
</head>
<body>
        <h1><?php echo $heading;?></h1>
</body>
</html>

上のファイルをそのままwebページとして出力するのではなく、$title変数と$heading変数に何かしらの値を格納した上でwebページとして出力したい、という場合にob_startを使うと良い。

具体的には、以下のように書くと良い。

<?php
$title = "sample page";
$heading = "sample heading";

ob_start();
require 'view.php';
$content = ob_get_clean();

echo $content;

上記のように書くことで、require 'view.php';とした時点で、$title変数の値を反映させたview.phpの内容がバッファリングに格納されて、$content = ob_get_clean();でバッファリングの内容を$content変数に格納している。

最後のecho $content;の時点では、ob_get_clean();でバッファリングがオフになっているので、標準出力として表示されるようになっている。

今回のob_start関数は、主にフレームワークのViewクラスやOutputクラスに書かれていることが多い。