PHPの出力バッファリング機能
Mac OS X 10.7 Lion をウチのMacBook Air にインストールしました。使っているアプリはほとんど問題なく動作しましたが、動かないアプリも1つありました。Lionは最初から64bitモードで動いているという話を眼にしたので、32bitモードで起動するようにしたところ、動くようになりました。動かないアプリの話もちらほら目にしたので、これくらいはラッキーな方だったのかもしれませんね。
今日は、PHPの「出力バッファリング機能」を使ってみます。これはなにかっていうと、普通echo命令をつかったり、require文で、PHPタグに囲まれてない文字列のあるテキストファイルを読み込むと、その時点で出力される内容が決まっていきます。(ブラウザやコンソールに出力されます。)出力バッファリングを使うと、出力するはずの内容を一旦ため込んでおいて、変数に代入したり、後の条件で出力させなかったりできます。
この機能が使われている代表例が、Webフレームワークです。(CakePHP。CodeIgniterもたぶん。)
今日は、出力バッファリング機能で、テンプレートファイルを分離するしくみについて簡単にとりあげます。
ob_start でバッファリング開始、ob_get_cleanで内容を取得 & 出力バッファクリア
2つのPHPファイルで出力バッファリングについて説明します。
template_load.php
<?php
$value1 = 'Hello';
$value2 = 'World';
ob_start(); // ...(1)
require 'template.php'; // ...(2)
$contents = ob_get_clean(); // ...(3)
echo 'テンプレートを読み込んだよ<br />'; // ...(4)
echo $contents; // ...(5)
別のファイルをrequireするPHPファイルです。(2)で読み込んでいます。
template.php
値1: <?php echo $value1; ?><br />
値2: <?php echo $value2; ?><br />
template_load.phpから読み込まれるファイルです。
この2つのファイルを同じディレクトリに置いて実行すると、次のように出力されます。
出力結果
テンプレートを読み込んだよ
値1: Hello
値2: World
(2)で読み込んだ内容が、(4)の後に出力されました。
出力バッファリング機能で、(2)の出力するはずだったものをため込んでおいたので出力結果のようになります。(1) ob_start()では、「以後出力するはずの内容はバッファにため込むように、という関数です。で、(3)ob_get_clean() は、ob_start以降ため込んだ内容を取得するとともに、バッファをクリアする関数です。
また、template_load.phpで代入した変数が、template.php内で参照できていることも注目です。($value1, $value2)requireすると、読み込み元のスコープと、読み込むPHPスクリプトのスコープは同じになるので、読み込み元の変数が読み込んだファイルからも参照できるのです。
まとめ
出力バッファリングを使って、テンプレートシステムの動作イメージをつかむためのサンプルを作ってみました。Webフレームワークだと、テンプレートに差し込む変数名を決められたり、共通部分を含めたページコンテンツの生成は別の段階で行ったりします。
出力バッファリングの使い方が気になった方は、Webフレームワークのコードを読んでみてください。